请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
解法;一开始想到的是双指针,但是没有想到可以用哈希表(看来题解之后)。一开始的想法是一个滑动窗口,一步步向右边移动,当右边遇到一个是我窗口里面有的,这时候把右边的元素加进到窗口,然后左边的窗口移动与右边最前面元素一样的元素的右边一位。这时候这一步的实现我在想肯定不是模拟吧,但是想来想去好像没有什么别的方法,后面看来题解,原来可以用哈希表维护最左边的指针呀。
class Solution {
public int lengthOfLongestSubstring(String s) {
int l=0;
int max=0;
HashMap<Character, Integer>map=new HashMap<>();
for(int i=0;i<s.length();i++){
if(!map.containsKey(s.charAt(i))){
map.put(s.charAt(i),i);
}
else{
l=Math.max(l,map.get(s.charAt(i))+1);
map.put(s.charAt(i),i);
//System.out.println("l "+l+"i "+i);
}
max=Math.max(i-l+1,max);
}
return max;
}
}