最長公共子序列的長度


最長公共子序列的長度

【試題描述】

        給定兩個字符串 str1 和 str2 ,如果將 str1 去掉一些字符后得到字符串str,將str2去掉一些字符后也能得到字符串 str ,我們就說 str 是 str1 和 str2 的一個公共子串。當然在得到str的時候不能改變字符的相對順序。請你編寫程序求出字符串 str 長度的最大值。

 

【輸入要求】

兩行,每行一個只含英文字母的字符串

 

【輸出要求】

一個數,表示兩個字符串的最長公共子串的長度

 

【輸入實例】

ABCEF
BMCGUAFB

  

【輸出實例】

3

  

【其他說明】

輸入的字符串長度均不超過1000

 

【試題分析】

    很簡單的動態規划,把這兩個序列兩層循環分段,定義一個數組f[i][j],表示第一個序列第i個字符與第二個序列的第j個字符的最長公共子序列,如果最后一個字符一樣的話,這最后一個字符相當於是有效的,所以第一個序列第i+1個字符與第二個序列的第j+1個字符的最長公共子序列就是第一個序列第i個字符與第二個序列的第j個字符的最長公共子序列長度+1,否則就是max(第一個序列第i個字符與第二個序列的第j+1個字符的最長公共子序列,第一個序列第i+1個字符與第二個序列的第j個字符的最長公共子序列),所以轉移方程就是:

 

  if(a[i]!=b[j]) f[i+1][j+1]=max{

                                           f[i+1][j],f[i][j+1]

                                     };

  else f[i+1][j+1]=f[i][j]+1;

 

【代碼】

# include<stdio.h>
# include<string.h>
# define N 1000
int str[N+2][N+2];
int main()
{
    int i,j,la,lb;
    char str1[N+1],str2[N+1];
    while(scanf("%s%s",str1,str2)!=EOF)
    {
         la=strlen(str1);
         lb=strlen(str2);
         for(i=0;i<=la;i++) str[0][i]=0;
         for(j=0;j<=lb;j++) str[j][0]=0;
         for(j=0;j<la;j++)//枚舉斷點
             for(i=0;i<lb;i++)
             {
                  if(str1[j]==str2[i]) str[i+1][j+1]=str[i][j]+1;
                  else str[i+1][j+1]=max(str[i][j+1],str[i+1][j]);
             }
          printf("%d/n",str[lb][la]);
    }
     return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM