3. Longest Substring Without Repeating Characters
题目:在字符串中找到最大长度不重复的子串
思路:HashMap+Two Pointer——用HashMap标记某个字符最晚出现的地方。用pre标记不重复的起始位置。当出现重复字符的时候,分成三种情况讨论:
1)原有重复字符正好是pre节点
2)原有重复字符不是pre节点
a)原有重复字符在pre节点之后
b)原有重复字符在pre节点之前
public class Solution {
public int lengthOfLongestSubstring(String s) {
int max = 0;
int pre = 0;
HashMap<Character,Integer> hm = new HashMap<>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(!hm.containsKey(c)){
hm.put(c,i);
max = Math.max(max,i-pre+1);
}
else{
if(c == s.charAt(pre)){
max = Math.max(max,i-pre);
pre = hm.get(c) + 1;
}
else{
if(pre < hm.get(c)){
max = Math.max(max,i-hm.get(c));
pre = hm.get(c) + 1;
}
else{
max = Math.max(max,i-pre+1);
}
}
hm.replace(c,i);
}
}
return max;
}
}
看了下别人的解法,主要是将情况合并了,缩短了一些时间,这里可以将在pre节点之前和正好是pre节点的情况合在一起。
public class Solution {
public int lengthOfLongestSubstring(String s) {
int max = 0;
int pre = 0;
HashMap<Character,Integer> hm = new HashMap<>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(!hm.containsKey(c)){
hm.put(c,i);
max = Math.max(max,i - pre + 1);
}
else{
if(pre <= hm.get(c)){
max = Math.max(max,i - hm.get(c));
pre = hm.get(c) + 1;
}
else{
max = Math.max(max,i - pre + 1);
}
hm.replace(c,i);
}
}
return max;
}
}