首页 > 其他 > 详细

最长不重复子序列

时间:2020-05-27 10:16:13      阅读:46      评论:0      收藏:0      [点我收藏+]

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

  

最长不重复子序列

原文:https://www.cnblogs.com/iamzhoug37/p/12970095.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!