step by step.
题目
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"
,所以其长度为 3。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b"
,所以其长度为 1。示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
思路
滑动窗口,遇到重复的则重新检查(要记录该字符最后出现的位置而非首次出现位置),并实时更新最长子串ans。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length(),ans=0;
Map<Character,Integer> map = new HashMap<>(); //存放所属字符最后出现的位置
for(int end=0,start=0;end<len;end++){
char ch = s.charAt(end);
if(map.containsKey(ch)){
start = Math.max(map.get(ch),start);//遇到相同的更新start
}
ans=Math.max(ans,end-start+1); //更新答案
map.put(s.charAt(end),end+1);
//更新该字符最后出现位置(以前的已经统计完了,已无用)
}
for (Character ch : map.keySet()) {
System.out.println("ch = " + ch+";value = "+map.get(ch));
}
return ans;
}
}
输出测试:
1.abcabcbb
2. bbbbb
3. pwwkew