给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路分析:
这个题我的思路是使用双指针去解决。因为不需要重复的数字,所以我们可以先让一个指针走,直到遇到相同字符的字母,这个时候我们停止操作,让另外一个指针开始移动,在移动的同时,需要去除他这个位置的字符,直到不重复位置。
查重的思路
判断重复的办法是创建一个map,key是字符,value是出现的次数,每次遇到一个字符的时候,就去map中查看,如果有,就让其value加一,如果没有就将其添加进去。如果value大于2了,就说明这个字符之前存在过。
class Solution {
public static int lengthOfLongestSubstring(String s) {
/**
* res 用于存储结果
* hashMap 用来保存每个字面出现的次数
*/
int res = 0;
HashMap<Character, Integer> hashMap = new HashMap<>();
for (int i = 0, j = 0; i < s.length(); i++) {
//如果这个值在map中存在,那么在原有的基础上加一,否则将其加入。
if (hashMap.containsKey(s.charAt(i))) {
Integer number = hashMap.get(s.charAt(i));
hashMap.replace(s.charAt(i),number + 1);
//System.out.println(s.charAt(i) + " " + hashMap.get(s.charAt(i)) + "number" + number);
} else {
hashMap.put(s.charAt(i),1);
}
//如果发现对应的值大于1的就说明有重复的字符,所以要让左指针往后移,直到没有为止。
while (hashMap.get(s.charAt(i)) > 1) {
Integer number = hashMap.get(s.charAt(j));
hashMap.put(s.charAt(j),number - 1);
j++;
}
res = Math.max(res,i - j + 1);
}
return res;
}
}