最长不重复子序列

思路,找相同元素之前出现的位置,如果不存在,那么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;
    }
}

  

posted @ 2020-05-27 02:09  iamzhoug37  阅读(449)  评论(0编辑  收藏  举报