Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
思路1.
需要记录 不重复子串的开始位置,假设子串A(i,j)是最长不重复字符的子串,则其内字符的出现次数均为1次,且第j+1个字符使其中某个字符的出现次数变为2,这时需要找到重复字符c的位置pos,将不重复字符的起始位置start设为pos+1,因为,在pos+1之前的字符往后,其最大长度不会超过当前最大长度,欲求最大长度,必须跳过该重复字符c,
需要hashtable记录字符出现次数,且当重复字符出现时更新最长字符长度,更新起始位置,同时把旧起点和新起点之间的字符出现次数清零。
特殊情况:
没重复字符,
最近的重复字符更新起点后,直到字符串末尾,没有出现新的重复字符,即最后一个子串的长度len,return max(maxlen,len)
int lengthOfLongestSubstring(string s) {
        int len=s.length();
        if(len<=1)
            return len;
        
        vector<int> table(256);
        
        int start=0,end=0;
        int maxlen=0;
        for(int i=0;i<len;++i){
            table[s[i]]++;
            if(table[s[i]]==2){
                int temp=i-start;
                maxlen=max(temp,maxlen);
                for(int j=start;j<i;++j){
                    table[s[j]]--;
                    if(s[j]==s[i]){
                         start=j+1;
                         break;
                    }
                       
                }
            }
        }
        return max(maxlen,len-start);
}
解法2:
方法1时间复杂度高,最坏情况下每个字符都要访问2遍,
其实,如果hashtable保持的不是出现次数,而是出现位置的话,可以通过比较字符的当前出现位置是否大于小于start,如果小于,则没有出现过,这时更新该字符的出现位置,
否则即为出现过,这时要更新起始start位置和maxlen,
 int lengthOfLongestSubstring(string s) {
        int len=s.length();
        if(len<=1)
            return len;
        vector<int> table(256,-1);
        int start=0;
        int maxlen=0;
        for(int i=0;i<len;++i){
            if(table[s[i]]<start){
                table[s[i]]=i;
            }
            else{
                maxlen=max(maxlen,i-start);
                start=table[s[i]]+1;
                table[s[i]]=i;
            }
        }
       
return max(maxlen,len-start);
    }

你可能感兴趣的:(LeetCode)