Longest Substring Without Repeating Characters 最长不重复子串

只遍历一次字符串即可求出最长不重复子串的长度。

int lengthOfLongestSubstring(string s) {
        vector<int> charhash(256,-1);   //记录字符上一次出现的位置,ASCII共有256个
        int start=-1;   //当前所在不重复子串的起始位置的上一个位置
        int maxlen=0;
        for(int i=0;i<s.size();i++)
        {
            if(charhash[s[i]]>start)   //如果该字符在当前子串中出现过
                start=charhash[s[i]];  //开始新的子串
            charhash[s[i]]=i;            //更新字符位置
            maxlen=max(maxlen,i-start);    //每遍历一个字符,都更新一下最长不重复子串长度
        }
        return maxlen;
    }

这种解法其实蕴含的就是动态规划的思想,只是写法非常的简便。

这道题动态规划的思路是:

遍历字符串的每一个字符i:

1. 若从当前不重复子串的起始位置开始,没有字符与i相同,则字符i可以添加进当前不重复子串,且当前不重复子串长度加1

2. 若从当前不重复子串的起始位置开始,字符i已经出现过,那么可以开始考察一个新的不重复子串,该子串包含当前字符i,且其长度为i-before

状态方程如下:

dp表示当前包含字符i的不重复子串的长度。before表示字符i上一次出现的位置,lastIndex是上一个不重复子串的起始位置。

*如果题目中涉及重复元素,就可以考虑用hash。

本题详细的分析,还可以参考:http://www.ahathinking.com/archives/123.html

posted on 2016-08-09 22:52  summerkiki  阅读(269)  评论(0编辑  收藏  举报