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

本文介绍了一种使用滑动窗口法求解给定字符串中最长无重复字符子字符串的问题。通过维护一个频率数组来判断字符是否重复,并利用两个指针进行动态调整,实现了高效的O(n)时间复杂度。
526

被折叠的 条评论
为什么被折叠?



