最长不重复子序列
思路,找相同元素之前出现的位置,如果不存在,那么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;
}
}
浙公网安备 33010602011771号