给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
例如,在"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 int lengthOfLongestSubstring(String s) {
char[] ss = s.toCharArray();
int res = 0;
int l = 0, r = -1;
int[] freq = new int[256];
while(l < ss.length){
if(r+1 < ss.length && freq[ss[r+1]] == 0)
freq[ss[++r]] = 1;
else
freq[ss[l++]] = 0;
res = Math.max(res, r - l + 1);
}
return res;
}
}