题目
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke", 是一个子序列,不是子串。
解答
使用滑动窗口:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null||s.length()==0){
return 0;
}
HashMap<Character,Integer> index=new HashMap<>();
int lo=0,hi=0;
int max=1;
int len=s.length();
index.put(s.charAt(lo),lo);
while(++hi<len){
int i=index.getOrDefault(s.charAt(hi),-1);
if(i==-1||i<lo){
// 说明当前窗口里没有s[hi]这个字符:可能是hi之前都没有,也可能是有,但是在lo之前
index.put(s.charAt(hi),hi);
}else{
// 说明当前窗口内已经有了s[hi],需要移(滑)动窗口
// 窗口长度本来是hi-lo+1,但是因为已经有一个重复的,所以要减一
max=Integer.max(max,hi-i);
// 修改lo,进行滑动
lo=i+1;
}
max=Integer.max(max,hi-lo+1);
// 更新index(保存的始终是滑动窗口之内的)
index.put(s.charAt(hi),hi);
}
return max;
}
}