题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
答案
解题思路
一开始没有想到滑动窗口的概念,再对start位置赋值的时候是以重复的位置开始。发现只有一半的用例可以通过。如pwwkew他的重置位置应该是第二个w,abcabcbb的重置位置应该是第一个b,但是开始的代码是从第二个a开始。
开了解答后发现了滑动窗口的概念,瞬间发现了问题所在。
修改后start每次只向后移动一位,在发现重复字符时,重置end的位置。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
// 分离字符串
char[] chars = s.toCharArray();
int tmpMax = 0;
// 最长字符串
int maxStr = 0;
// 双指针
int start=0,end=0;
// 已存在字符
Set map = new HashSet();
while (end < chars.length){
if (!map.contains(chars[end])){
map.add(chars[end]);
end++;
tmpMax = end - start;
}else {
start ++;
end = start;
map.clear();
}
maxStr = Math.max(tmpMax,maxStr);
}
return maxStr;
}
}
运行时间比较久,暂以训练解题能力为主,不做修改