给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
例如,在"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;
}
};