题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解题
使用滑动窗口解答, 判断字符是不是重复, 使用字符数组来判断
- 设定l,r两个指针, 首先移动指针r直到出现重复字符,这个时候只可能有一个字符重复, 然后再移动字符l,
- 如果已经不包含重复字符了, 如果移除的字符是已经出现过的字符, 则表示此时[l…r]之间已经没有重复字符了
- 重复上面整个步骤, 完成整改遍历过程即可, 遍历过程中记录r - l + 1的最大值, 具体代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] freq = new char[256];
// 设定s的[left,right]子串无重复字符
int l = 0, r = -1;
int max = 0;
while (l < s.length()){
if (r == s.length() - 1){
break;
}
if (freq[s.charAt(r + 1)] == 0){
freq[s.charAt(r + 1)]++;
r++;
max = Math.max(max, r - l + 1);
} else {
freq[s.charAt(l)]--;
l++;
}
}
return max;
}
}