题目描述:Given a string, find the length of the longest substring without repeating characters.
测试用例1:
输入: "abcabcbb"
输出: 3
测试用例1:
输入:"bbbbb"
输出: 1
测试用例1:
输入: "pwwkew"
输出: 3
题目解释:给定一个字符串,返回其无重复字母子串的最大长度。
思路:滑动窗口的思想,使用两个指针,指针l表示子串窗口尾巴,指针r表示窗口头,cursorHead往前扫描。并将没出现在窗口内的字符保存起来。当窗口内出现重复字符时(设位置为p),清空窗口内p之前的记录,设置l的位置,移动窗口到p之后。字符数有限,用数组代替HashMap会稍微快一点。
代码:
public int lengthOfLongestSubstring(String s) {
if(s.length() <= 1) {
return s.length();
}
int res = 1;
//记录窗口内元素出现的位置
int[] window = new int[128];
for (int i = 0; i < 128; i++) {
window[i] = -1;
}
int l = 0;//窗口尾
int r = 1;//窗口头
window[s.charAt(0)] = 0;
while(r < s.length()) {
char c = s.charAt(r);
if(window[c] == -1) {
window[c] = r;
} else {//窗口内出线重复字符时
//清除window中p之前的数据 相当于窗口尾巴移动到p之后
int p = window[c];
for (int i = l; i <= p; i++) {
window[s.charAt(i)] = -1;
}
window[c] = r;
int len = r - l;
if(len > res) {
res = len;
}
l = p + 1;
}
r++;
}
int len = r - l;
if(len > res) {
res = len;
}
return res;
}