zoukankan      html  css  js  c++  java
  • 最长公共子串问题 LCS

    
    
    /*
    题目描述:最长公共字串问题(LCS)。如果字符串一的所有字符按其顺序出现在另外一个字符串二中,
    则字符串一称之为字符串二的字串。注意,并不要求子串(字符串一)的字符连续出现在字符串二中。
    请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印其中任意一个最长公共子串。
    例如:BDCABA和ABCBDAB,字符串BCBA和BDAB都是它们的最长公共子串。
    */
    
    #include<iostream>
    #include<vector>
    #include<assert.h>
    #include<cstring>
    using namespace std;
    
    const int N = 100;
    const int LEFT_UP = 1;
    const int LEFT = 2;
    const int UP = 3;
    
    int f[N][N],path[N][N];
    
    void initData(int len1, int len2)
    {
        for(int i=0; i<len1; i++)
            for(int j=0; j<len2; j++)
            {
                f[i][j] = 0;
                path[i][j] = 0;
            }
    }
    
    //求str1和str2的LCS
    int findLCS(char str1[], int len1, char str2[], int len2)
    {
        initData(len1, len2);
    
        //第0行与第0列我们将其初始化为0,故从1开始计数。
        for(int i=1; i<=len1; i++)
            for(int j=1; j<=len2; j++)
            {
                if(str1[i] == str2[j])
                {
                    f[i][j] = f[i-1][j-1] + 1;
                    path[i][j] = LEFT_UP;
                }
                else if(f[i-1][j] >= f[i][j-1])
                {
                    f[i][j] = f[i-1][j];
                    path[i][j] = UP;
                }
                else
                {
                    f[i][j] = f[i][j-1];
                    path[i][j] = LEFT;
                }
                
            }
        return f[len1][len2];
    }
    
    //逆序打印LCS。
    void printLCS(char str1[],int len1, char str2[], int len2)
    {
        int i = len1;
        int j = len2;
        
        while(i>0 && j>0)
        {
            if(path[i][j] = LEFT_UP)
            {
                cout<<str1[i];
                i--;
                j--;
            }
            else if(path[i][j] = UP)
                i--;
            else
                j--;
        }
    
    }
    
    
    int main()
    {
        char str1[] = "BDCABA";
        int len1 = 6;
        char str2[] = "ABCBDAB";
        int len2 = 7;
    
        cout<<"LCS length = "<<findLCS(str1,len1, str2,len2)<<endl;
        printLCS(str1,len1, str2,len2);
        cout<<endl;
        
        return 0;
    }
    
    
    
     
    多学习,多总结。
  • 相关阅读:
    Swift语法基础: 20
    Swift语法基础:19
    Swift语法基础:18
    Swift语法基础:17
    Swift语法基础:16
    Swift语法基础:15
    Swift语法基础:14
    Swift语法基础:13
    Swift语法基础:12
    Swift语法基础:11
  • 原文地址:https://www.cnblogs.com/yanhaiming/p/2585749.html
Copyright © 2011-2022 走看看