前言
保持滑动窗口、前缀和对连续子数组和字符串的敏感性,才能转换问题,举一反三,顺利拆解题。
一、案例
二、题解
因其s不仅仅由小写字母组成,所以使用set来记录其字符,通过滑动窗口来记录最长连续字符串的长度。
package com.xhu.offer.offerII;
import java.util.HashSet;
import java.util.Set;
//不含重复字符的最长子字符串
public class LengthOfLongestSubstring {
public int lengthOfLongestSubstring(String s) {
//因其s不仅仅由小写字母组成,所以使用set来记录其字符,通过滑动窗口来记录最长连续字符串的长度。
Set<Character> cache = new HashSet<>();
int len = s.length(), maxLen = 0;
int begin = 0, end = 0;
for (; end < len;) {
Character ch = s.charAt(end);
if (cache.contains(ch)) {
int gap = end - begin;
maxLen = maxLen < gap ? gap : maxLen;
cache.remove(s.charAt(begin++));
continue;
}
cache.add(ch);
end++;
}
int t = end - begin;
return maxLen < t ? t : maxLen;
}
}
总结
1)保持滑动窗口、前缀和对连续子数组和字符串的敏感性,才能转换问题,举一反三,顺利拆解题。
参考文献
[1] LeetCode 原题