【两次过】【滑动窗口】Lintcode 384. 最长无重复字符的子串

给定一个字符串,请找出其中无重复字符的最长子字符串。

样例

例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3

对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1

挑战

O(n) 时间

解题思路:

    滑动窗口法。假设现在考察这样一个字串s,从i到j没有重复字母。


    我们为了要找最长的字串,就要j++,查看j+1元素是否与当前字串有重复字母。如果没有则继续j++,直到某一刻j+1的字符与当前字串中产生了重复字母,此时j无法继续向前拓展,记录当前长度,之后i++,直到将这个重复字符刨除出去,j又继续拓展...

    一个问题是:如何判定下一个字符与当前字串是否存在重复字符?可以设置一个数组freq[256],freq[k]中存放的就是ASCII码为k的字符在字串中出现的频率。

class Solution {
public:
    /**
     * @param s: a string
     * @return: an integer
     */
    int lengthOfLongestSubstring(string &s) 
    {
        // write your code here
        int l = 0 , r = -1;
        int res = 0;
        int freq[256] = {0};
        
        while(l < s.size())
        {
            if(r+1<s.size() && freq[s[r+1]]==0)
                freq[s[++r]]++;
            else
                freq[s[l++]]--;
            
            res = max(res , r-l+1);
        }
        
        return res;
    }
};



猜你喜欢

转载自blog.csdn.net/majichen95/article/details/80908129