题目描述
代码
总体思想是 “滑动窗口” ,左指针右指针控制窗口大小,遇到相同元素,左指针移动到第一次出现的元素的后一位,右指针每次后移一位。
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> sliwid = new HashMap();
int ans = 0;
for (int end = 0,start =0; end < s.length(); end++) {
if (sliwid.containsKey(s.charAt(end))) {
start = Math.max(sliwid.get(s.charAt(end))+1, start);
}
sliwid.put(s.charAt(end), end);
ans = Math.max(end-start+1, ans);
}
return ans;
}
}
问题是为什么start = Math.max(sliwid.get(s.charAt(end))+1, start)这一行,为什么start不直接为sliwid.get(s.charAt(end))+1,而要和start本身比大小呢?
解释
…a…b…a…a…b…
在这种情况下,第二个a会把start更新到第一个a之后,第三个a会把start更新到第二个a之后,到第二个b如果没有判断,start会选择回到第二个a的位置。
心得体会
解一道题一定要多考虑一些测试用例,而不是只参考题目中给的样例。