【动态规划】 | #最长无重复子数组#

最长无重复子数组

http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

确定dp含义:dp数组代表以arr[i]结尾的最大无重复子数组

初始状态:dp[0] = 0 ,没数字肯定长度为0

转换方程:所以我们可以将arr[i]和离arr[i]最近的相等数字的距离与上一个dp[i - 1]的距离相比较,就可以知道重复的数字究竟是否包含在上一次最大的dp[i - 1]中。

if(不存在重复(j == -1)){
	dp[i] = dp[i - 1] + 1;//不存在重复直接+1
}else{
	if(重复的字符包含于dp[i - 1]的子串里(dp[i - 1] >= i - j - 1)){
    	dp[i] = i - j - 1;//因为存在重复的字符了,所以得由重复字符j所在位置决定
    }else if(不存在dp[i - 1]子串中(dp[i - 1] < i - j - 1)){
    	dp[i] = dp[i - 1] + 1;
    }
}
import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
   public int maxLength (int[] arr) {
        int len = arr.length;
        int[] dp = new int[len + 1];
        if(len == 0){
            return 0;
        }
        dp[0] = 0;
        //j代表i左边第一个和i相等的元素
        //dp代表以i为结尾的最长无重复子数组
        int max = 0;
        for(int i = 1;i <= arr.length;i++){
            int j;
            for(j = i - 2;j >= 0;j--){
                if(j >= 0 && arr[j] == arr[i - 1]){
                    break;
                }
            }
            if(j == -1){
                dp[i] = dp[i - 1] + 1;
            }else{
                if(dp[i - 1] < i - j - 1){
                    dp[i] = dp[i - 1] + 1;
                }else{
                    dp[i] = i - j - 1;
                }
            }
            max = Math.max(max,dp[i]);
        }
        return max;
    }
}
全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
可可可可可_:nb啊,看样子是专科玩了几年随便专升本了个民办,又玩了两年。你这能找到我吃
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务