方法一:滑动窗口
参考:滑动窗口问题合集
方法二:动态规划
public int lengthOfLongestSubstring(String s){
HashMap<Character,Integer> map=new HashMap<>();
int[] dp=new int[s.length()+1];
dp[0]=0;
int maxLen=0;
for(int i=1;i<=s.length();i++){
char c=s.charAt(i-1);
if(!map.containsKey(c)){
dp[i]=dp[i-1]+1;
map.put(c,i);
}
else{
int index=map.get(c);
if(i-dp[i-1]>index){
dp[i]=dp[i-1]+1;
}
else{
dp[i]=i-index;
}
map.put(c,i);
}
maxLen=Math.max(maxLen,dp[i]);
}
return maxLen;
}
优化代码:数组变为变量
public int lengthOfLongestSubstring(String s){
HashMap<Character,Integer> map=new HashMap<>();
int lastDP=0;
int maxLen=0;
for(int i=1;i<=s.length();i++){
char c=s.charAt(i-1);
if(!map.containsKey(c)){
lastDP+=1;
map.put(c,i);
}
else{
int index=map.get(c);
if(i-lastDP>index){
lastDP+=1;
}
else{
lastDP=i-index;
}
map.put(c,i);
}
maxLen=Math.max(maxLen,lastDP);
}
return maxLen;
}