Java解法
这个题之前刷过一次,但面试的时候问到又懵逼了,就很气,当时想到了滑动窗口,但具体怎么滑却没有记得,关键点还是利用hashmap快速定位到重复字符串的下标,然后进行计算之间字符串的长度。
这个里面还有个坑点,就是正常情况下,i代表起点位置或重复字符的位置,如果i是j扩展过程中遇到的重复字符串位置,计算长度的时候应该是j - i,不用再加1(因为两者相同),如果i是计算的一次起点,就应该是j - i + 1(算上起点字符)。为了解决这个问题,map中记录的是字符的下一个位置,这样i代表重复字符的位置时,实际上是下一个位置,这样也可以用j - i + 1了。
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int n = s.length(), ans = 0;
for (int i = 0, j = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(i, map.get(s.charAt(j)));
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
}