1.给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
代码展示:
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
if(n<=1){
return n;
}
int maxlen = 1;
int left = 0;
int right = 0;
Set<Character> set = new HashSet<>();
while (right < n){
char rightChar = s.charAt(right);
while (set.contains(rightChar)){
set.remove(s.charAt(left));
left++;
}
maxlen = Math.max(maxlen,right-left+1);
set.add(rightChar);
right++;
}
return maxlen;
}
}
那么这个代码还可以再简化一下吗?当然可以
前面我们的right如果遇到重复的代码,left++是一步一步走,现在我们让其一步走到重复的字符前一个位置
import java.util.HashMap;
import java.util.Map;
public class TestDemo {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
if(n <= 1){
return n;
}
int maxlen = 1;
int left = 0;
int right = 0;
//利用HashMap的key可以找到val值,我们将之前的HashSet改为HashMap
Map<Character,Integer> map = new HashMap<>();
while (right < n){
char rightChar = s.charAt(right);
//找到重复字符的key值,没有就返回-1
int rightCharIndex = map.getOrDefault(rightChar,-1);
left = Math.max(left,rightCharIndex);
maxlen = Math.max(maxlen,right-left+1);
map.put(rightChar,right+1);
right++;
}
return maxlen;
}
}