[leetcode]3. 无重复字符的最长子串

1.题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

2.代码:

//table[]用来存储128个ascii码的出现次数,只能是0,1,2,在start->i-1之间的只能是1,2
//从start->i-1要求是无重复字符的字符创
//对一个字符串若从start开始的table[s[i]]为:1,1,,1,1,2(就是i指的那个数,不然不会是2),1,1,2(当前i位置   
//此时currlen为8,此时currlen为当前从start->第2个2的长度
//那么直到遇到2之前currlen--,遇见2了就把start设为下一位。
//修改后currlen为从当前start(第一个2后面)->第二个2的长度,currlen==3
//修改后的table[s[i]]为:0,0,0,0,1,1(当前start),1,1,1(当前i位置

int lengthOfLongestSubstring(char* s) {
    int table[128];
    memset(table,0,sizeof(table));
    int maxlen=0,currlen=0,start=0;
    for(int i=0;s[i]!='\0';++i){
        int num=++table[s[i]];
        if(num==2){
            if(currlen>maxlen)
                maxlen=currlen;
            for(int j=start;j<i;++j){
                if(s[j]==s[i]){
                    table[s[j]]=1;
                    start=j+1;
                    break;
                }
                else{
                    --currlen;
                    table[s[j]]=0;                    
                }
            }    
        }
        else{
            ++currlen;        
        }        
    }
    if(currlen>maxlen)           //[" "]情况currlen=1,maxlen=1
        maxlen=currlen;
    return maxlen;
}

3.知识点:

双指针法

猜你喜欢

转载自blog.csdn.net/MJ_Lee/article/details/88342147