无重复字符的最大子串

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

示例 1:

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

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

分析:

建立字符的索引表,记录该字符出现的位置,当再次出现同样字符时,可以通过位置的差值来计算此时无相同字符串的长度,再和前面的最长字符串长度比较,取最大值。

假设前面已经取得最长字符串长度len:

len = max { cur_i - front_i, len };

cur_i代表当前出现的字符,而front_i代表前面出现和当前字符相等的字符,通过两者索引的差值可得当前长度。

参考代码

int max(int a,int b)
{
    return a>b?a:b;
}
int lengthOfLongestSubstring(char* s) {
    if(s==NULL)
        return 0;
    if(0==strcmp(s,""))
        return 0;
    int len=0;
    int n=strlen(s);
    int index[128]={0}; //保存每个字符的索引
    int j=0;
    for(int i=0;i<n;i++)
    {
        j=max(index[s[i]],j); //前一个相同字符的索引
        len=max(i-j+1,len); //计算当前长度和前面最大长度比较
        index[s[i]]=i+1; //建立新索引
    }
    return len;
}

猜你喜欢

转载自blog.csdn.net/weixin_40850689/article/details/86664033