zoukankan      html  css  js  c++  java
  • LintCode 77: 最长公共子序列

    public class Solution {
        /**
         * @param A, B: Two string.
         * @return: the length of the longest common substring.
         */
        public int longestCommonSubsequence(String A, String B) {
            int lenA = A.length();
        	int lenB = B.length();
        	if(lenA==0 || lenB==0){
        	    return 0;
        	}
            int [][] result = new int[lenA+1][lenB+1];
            int maxResult = -1;
            for(int i=0;i<lenA+1;i++){
            	for(int j=0;j<lenB+1;j++){
            		result[i][j] = 0;
            	}
            }
            for(int i=1;i<=lenA;i++){
                for(int j=1;j<=lenB;j++){
                    if(A.charAt(i-1) == B.charAt(j-1)){
                        result[i][j] = result[i-1][j-1]+1;
                    }else{
                    	result[i][j] = max(result[i-1][j],result[i][j-1]);
                    }
                    maxResult = max(result[i][j],maxResult);
                }
            }
            return maxResult;
        }
        public int max(int src,int dst){
            if(src > dst){
                return src;
            }else{
                return dst;
            }
        }
    }
    

      思路:

        经典dp

        (1)找状态,从后到前,目标:result[i][j]表示,A[i]与B[j]的最长公共子序列(i<=n,j<=m)。

        (2)确定状态转移方程,二种决策(a[i] b[i]一样,  a[i] b[i]不一样)

        (3)复杂度为O(lenA*lenB),此种解法为递推,从前到后,使用循环来写。

        (4)还有一种解法是递归,从后到前,记忆化搜索(备忘录)

        (5)边界条件是遇到0

  • 相关阅读:
    MySQL 中文显示乱码
    sprintf
    持续集成
    两个数据库中的数据同步问题(转)
    指针和引用的区别
    #define,const,typedef三者联系与区别
    [转载]selenium webdriver学习(八)
    PHPUnit学习安装
    CI是什么?
    图形界面的操作(转)
  • 原文地址:https://www.cnblogs.com/xieweichong/p/5943877.html
Copyright © 2011-2022 走看看