上一篇我们总结了两个字符串的一个最长操作——最长公共连续子串,现在我们来总结下另外一个最长——最长公共子序列,这个和上一个的区别在于,它不用要求子序列连续。
这个是DP的典型题,
子字符串的最优解为字符串提供了决策依据。有两个字符串s和p,设dp[i,j]为子串s[0-i]和p[0-j]的最长公共子序列的长度,
如果s[i]=p[j],则dp[i,j]=dp[i-1,j-1]+1;
如果s[i]!=p[j],则dp[i,j]要么等于s[0,i-1]和p[0,j]的最长公共子序列的长度,要么等于s[0,i]和p[0,j-1]的最长公共子序列的长度,取两者的最大值即是dp[i,j]
初始值:dp[0][0]=0,dp[0][j]=0,dp[i][0]=0
int lcs(string s, string p) { int len1 = s.length(); int len2 = p.length(); int dp[][] = new int[len1+1][len2+1]; for (int i = 0; i <= len1; i++) { for( int j = 0; j <= len2; j++) { if(i == 0 || j == 0) { dp[i][j] = 0; } else if (s.[i-1] == p[j-1]) { dp[i][j] = c[i-1][j-1] + 1; } else { dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); } } } return dp[len1][len2]; }