方法一:动态规划+哈希表
public int lengthOfLongestSubstring(String s){
HashMap<Character,Integer> map=new HashMap<>();
int lastDp=0;
int res=0;
for(int i=0;i<s.length();i++){
int lastIndex=map.getOrDefault(s.charAt(i),-1);
map.put(s.charAt(i),i);
lastDp=i-lastIndex>lastDp?lastDp+1:i-lastIndex;
res=Math.max(res,lastDp);
}
return res;
}
方法二:动态规划+线性遍历
public int lengthOfLongestSubstring(String s){
int lastDp=0;
int res=0;
for(int i=0;i<s.length();i++){
int startIndex=i-1;
while(startIndex>=0&&s.charAt(startIndex)!=s.charAt(i)){
startIndex--;
}
lastDp=i-startIndex>lastDp?lastDp+1:i-startIndex;
res=Math.max(res,lastDp);
}
return res;
}
方法三:双指针+哈希表(滑动窗口)
public int lengthOfLongestSubstring(String s){
HashMap<Character,Integer> map=new HashMap<>();
int res=0;
int start=-1;
for(int i=0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){
start=Math.max(start,map.get(s.charAt(i)));
}
map.put(s.charAt(i),i);
res=Math.max(res,i-start);
}
return res;
}