题目
https://leetcode.com/problems/longest-substring-without-repeating-characters/
枚举所有子串进行重复判断,应该会超时。考虑更优化的方式
思路一
将问题转化为:遍历整个字符串的单个字符,计算以当前字符结尾的不重复子串长度,取最大值。注意这里的串必须以当前的单个字符结尾。这样问题就很好解决了:用当前字符的下标减去最早没有出现过重复字符的位置即可。
最早没出现过重复字符的位置怎么计算?如果所有的字符都只出现了一次,那么这个值是0,如果某个字符出现多次,那位置就是重复字符倒数第二次出现的下一个位置,注意这里要对所有重复字符取最大值。
具体解法:
遍历字符串,用map维护字符最后一次出现的下标,用变量left记录最终没出现过重复字符的位置。对于当前的字符,如果在之前出现过位置为i,更新left=max(i,left),然后最长的字符串长度为当前坐标减left
代码
public static int lengthOfLongestSubstring(String s) {
if (s == null || "".equals(s)) {
return 0;
}
Map<Character, Integer> indexMap = new HashMap<>();
int maxLen = 0;
int left = 0;
for (int i = 0; i < s.length(); i ++) {
char c = s.charAt(i);
if (indexMap.get(c) != null) {
left = indexMap.get(c) > left ? indexMap.get(c) : left;
}
maxLen = i - left + 1 > maxLen ? i - left + 1 : maxLen;
indexMap.put(c, i + 1);
}
return maxLen;
}
网友评论