子序列

2018-08-21  本文已影响10人  稀饭粥95

最长公共子序列(LCS)(lintcode 77)

描述:给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。(不需要连续)
样例:
给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),返回1
给出 "ABCD" 和 "EACB",这个LCS是"AC"返回 2

public class Solution {
    /**
     * @param A: A string
     * @param B: A string
     * @return: The length of longest common subsequence of A and B
     */
    public int longestCommonSubsequence(String A, String B) {
        int dp[][] = new int[A.length()+1][B.length()+1];
        for(int i=0;i<=A.length();i++){
            dp[i][0] = 0;
        }
        for(int i=0;i<=B.length();i++){
            dp[0][i] =0;
        }
        for(int i=1;i<=A.length();i++){
            for(int j=1;j<=B.length();j++){
                //注意是下标是i-1,j-1
                if(A.charAt(i-1)==B.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1]+1;
                }else{
                    dp[i][j] = dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1]; 
                }
            }
        }
        return dp[A.length()][B.length()];
    }
}

最长公共子串

描述:给出两个字符串,找到最长公共子串,并返回其长度。子串要连续

public class Solution {
    /**
     * @param A: A string
     * @param B: A string
     * @return: the length of the longest common substring.
     */
    public int longestCommonSubstring(String A, String B) {
        // write your code here
        int dp[][] = new int[A.length()+1][B.length()+1];
        int max = 0;
        for(int i=0;i<=A.length();i++){
            dp[i][0] = 0;
        }
        for(int i=0;i<=B.length();i++){
            dp[0][i] =0;
        }
        for(int i=1;i<=A.length();i++){
            for(int j=1;j<=B.length();j++){
                //注意是下标是i-1,j-1
                if(A.charAt(i-1)==B.charAt(j-1)){
                    int a = dp[i][j] = dp[i-1][j-1]+1;
                    if(max<a) max = a;
                }else{
                    dp[i][j] = 0; //不同之处
                }
            }
        }
        return max;
    }
}

最长上升连续子序列(lintcode 397)

给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)
样例
给定 [5, 4, 2, 1, 3], 其最长上升连续子序列(LICS)为 [5, 4, 2, 1], 返回 4.
给定 [5, 1, 2, 3, 4], 其最长上升连续子序列(LICS)为 [1, 2, 3, 4], 返回 4.

public class Solution {
    /**
     * @param A: An array of Integer
     * @return: an integer
     */
    public int longestIncreasingContinuousSubsequence(int[] a) {
        if(a.length==0) return 0;
        int max = Integer.MIN_VALUE;
        int last=a[0];
        int c1=1;
        int c2=1;
        for(int i=0;i<a.length;i++){
            if(a[i]>last){
                c1++;
            }else{
                c1=1;
            }
            if(a[i]<last){
                c2++;
            }else{
                c2=1;
            }
            last=a[i];
            if(c1>max) max = c1;
            if(c2>max) max = c2;
        }
        return max;
    }
}

最长上升子序列(lintcode 76)

描述:给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。不连续。
o(n2)

public class Solution {
    /**
     * @param nums: An integer array
     * @return: The length of LIS (longest increasing subsequence)
     */
    public int longestIncreasingSubsequence(int[] nums) {
        if(nums.length==0) return 0;
        int s[] = new int[nums.length];
        int max = Integer.MIN_VALUE;
        for(int i=0;i<nums.length;i++){
            s[i] = 1;
            for(int j=i-1;j>=0;j--){
                //从前一个位置一直遍历到头,不能遍历一半
                if(nums[i]>nums[j]&&(s[j]+1)>s[i]){
                    s[i] = s[j]+1;
                }
            }
            if(s[i]>max) max = s[i];
        }
        return max;
    }
}
上一篇下一篇

猜你喜欢

热点阅读