思路,找相同元素之前出现的位置,如果不存在,那么dp[j]=dp[j-1]+1
如果相同的元素存在,且不在dp[j-1]的那个长度内,那么dp[j]=dp[j-1]+1
否则,说明这个元素重复了,那就只能等于j-1,例子就是1,2,2,1,3,1里面的2,1,3,1;2,1,3是dp[j-1],然后1重复了,那么最后这个1的dp[j]=j-i
https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/
import java.util.HashMap; import java.util.Map; class Solution { public int lengthOfLongestSubstring(String s) { if(s == null || s.length() == 0){ return 0; } Map<Character,Integer> index = new HashMap<>(); int max = 1 ; int before = 1;//dp[j-1] index.put(s.charAt(0),0); for(int i=1; i<s.length(); i++){ if(index.containsKey(s.charAt(i))) { int sameCharIndex = index.get(s.charAt(i)) ; if(before < (i-sameCharIndex)) { before = before+1;//说明相同的元素不在j-1的这个范围内,那么dp[j]=dp[j-1]+1 } else { before = i-sameCharIndex;//相同元素在j-1的范围内,那么before就是j-i } max = Math.max(max,before); } else { before = before+1;//相同元素之前未出现,那么dp[j]= dp[j-1]+1 max = Math.max(max, before); } index.put(s.charAt(i),i); } return max; } }