题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
算法思路
- 利用双指针算法,当i走过的时候就将这个字符放入map,并且赋值1,这里有一个技巧就是getOrDefault,如果得到了这个值说明这个字符不是第一次进入map则1 + 1
- 在用一个while让j指针往前走直到消除重复元素
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int ans = 0;
for(int i = 0, j = 0; i < s.length();i ++){
//getOrDefault 如果map里面没有就get到默认的0,然后+1 如果里面有相同的值则get到 1 然后 再加 1
//就是将s的字符一个个存入map并且编号
map.put(s.charAt(i),map.getOrDefault(s.charAt(i), 0) + 1);
//判断i的位置的元素是否重复,重复j向前走
//区间是[j,i]
while(map.get(s.charAt(i)) > 1){
// 覆盖原来的 value
map.put(s.charAt(j), map.get(s.charAt(j)) - 1);
j ++;
}
ans = Math.max(ans, i - j + 1);
}
return ans;
}
}