无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
这题很简单,将问题分解,从第一个字符开始,当前长度为1,每将后面的一个字符加进来,进行判断,相同当前长度就是1,不同就到用当前字符从前一个字符前一位往前开始进行判断当前长度次,如果存在相同就更新当前长度为当前字符到这个相同字符的距离,如果没有相同,就在当前长度+1得到新的当前长度。还有更简单的方法,就不管了。
在写代码的过程中遇到几个问题
- 字符创长度为1和0
- 因为循环是从1开始的,忘记将字符0放进hash里面,导致
abcab
误判为4abca
- 如果hash没有这个字符返回-1,之前返回0导致第一个字符被误判为当前字符的重复,比如
pbf
得到的就是2
public int lengthOfLongestSubstring(String s) {
if (s.length() == 1) {
return 1;
}
if (s.length() == 0) {
return 0;
}
int result = 0;
int former = 1;
Map<Character, Integer> hash = new HashMap<Character, Integer>();
hash.put(s.charAt(0),0);
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
former = 1;
System.out.println(i+"===="+former+"|1111");
} else {
int max = hash.getOrDefault(s.charAt(i), -1);
if (max < i - 1 && max >= i - former) {
former = i - max;
System.out.println(i+"===="+former+"|22222");
} else {
former = former + 1;
System.out.println(i+"===="+former+"|33333"+"==="+max);
}
}
if (former > result) {
result = former;
}
hash.put(s.charAt(i), i);
}
System.out.println(hash.toString());
return result;
}