给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
解决思路:采用哈希表+双指针;
哈希表用来存储没有重复的字符,left为左边界,right为右边界。每次查询哈希表中是否有相同的元素,如果有直接更新left左边界。然后每比较一次都要更新最大长度maxlen。
采用Math.max是为了防止left往左移动,反正只需要记住left只能往右移动。
例如:abba
第一个a存储,第二个b存储,第三个b发现一样了,更新left,为2。第四个a发现,重复,如果不用Math.max,此时left就会变为1。可以跟着代码你自己走一遍你就清楚了。
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map = new HashMap<>();
int left = 0;
int maxlen = 0;
for(int right = 0; right<s.length();right++){
char ch = s.charAt(right);
//是否重复出现
if(map.containsKey(ch)){
//更新
left = Math.max(left,map.get(ch) + 1);
}
//更新元素
map.put(ch,right);
//更新最大长度
maxlen = Math.max(maxlen,right-left+1);
}
return maxlen;
}
}
总结
这道题采用哈希表+双指针,维护一个没有重复字符串的空窗口,希望能帮助你。