[華爲oj]公共子串計算

照舊,先上下個人暴力破解法:ios

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string ToLower(string ss)
{
    string::iterator itr;
    for(itr=ss.begin();itr!=ss.end();itr++)
    {
        *itr=tolower(*itr);
    }
    return ss;
}

int getCommonStrLength(string pFirstStr,string pSecondStr)
{
    int firstLen=pFirstStr.length();
    int secondLen=pSecondStr.length();
    int countMax=0;

    for(int f=0;f<firstLen;f++)
    {
        int fCurrent=f;
        for(int s=0;s<secondLen;s++)
        {
            int tempCount=0;
            int sCurrent=s;
            while(sCurrent<secondLen&&fCurrent<firstLen&&pFirstStr[fCurrent]==pSecondStr[sCurrent])
            {
                ++tempCount;
                ++fCurrent;
                ++sCurrent;
            }
            if(tempCount>countMax)
                countMax=tempCount;
        }
    }

    return countMax;
}

int main()
{
    string fStr;
    string sStr;
    cin>>fStr>>sStr;
    fStr=ToLower(fStr);
    sStr=ToLower(sStr);
    cout<<getCommonStrLength(fStr,sStr)<<endl;
}

 

兩個for循環是必須的,可是第二層的for循環內的while就明顯是進行了不少重複的操做比較。得改!那就是要記錄以前作過的記錄,考慮用動態規劃思想進行。算法

其實我開始的時候打算用後綴數組進行比較,但沒思路。就沒進行下去了。最後,在網上搜了下,有一種思路是利用前綴數組進行LCS算法。用一個二維數組Sub[firstLen][SecondLen]記錄公共字符串,即Sub[m][n]記錄的是第一個字符串第m位開始於第二個字符串第n位開始具備的公共字符串。那麼,在比較Sub[m+1][n+1]時,咱們只須要判斷FirstStr[m+1],SecondStr[n+1]便可,若是他們相同,那麼就能夠利用以前Sub[m][n]的記錄,由於第一個字符串從m+1往前,m位之前的以前已經比較過了;同理,第二個字符串從n+1開始,n位以前的已經比較過了,因此Sub[m+1][n+1]=Sub[m][n]+FirstStr[m+1]。數組

 

代碼:spa

http://blog.csdn.net/liufeng_king/article/details/8528858.net

// CPPPRO.cpp : 定義控制檯應用程序的入口點。  
//3m6 最長公共子串,動態規劃實現  
#include "stdafx.h"  
#include <iostream>    
#include <string>  
using namespace std;   
  
string getLCSLength(string &s, string &t);  
  
int main()  
{  
    string s,t;  
    cout<<"請輸入字符串s:"<<endl;  
    cin>>s;  
    cout<<"請輸入字符串t:"<<endl;  
    cin>>t;  
    cout<<"最長公共子串爲:"<<endl;  
    cout<<getLCSLength(s,t)<<endl;  
    return 0;  
}  
  
string getLCSLength(string &s, string &t)  
{  
    int p = s.length();  
    int q = t.length();  
  
    string **num = new string *[p];    
    for(int i=0;i<p;i++)      
    {      
        num[i] = new string[q];    
    }     
  
    char char1 = '\0';  
    char char2 = '\0';  
  
    int len = 0;  
    string lcs = "" ;  
  
    for(int i=0; i<p; i++)  
    {  
        for (int j=0; j<t.length(); j++)  
        {  
            char1 = s.at(i);  
            char2 = t.at(j);  
            if(char1!=char2)  
            {  
                num[i][j] = "" ;  
            }  
            else  
            {  
                if (i==0||j==0)  
                {  
                    num[i][j]=char1;  
                }  
                else  
                {  
                    num[i][j]=num[i-1][j-1]+char1;  
                }  
                if(num[i][j].length()>len)  
                {  
                    len = num[i][j].length() ;  
                    lcs = num[i][j];  
                }  
                else if(num[i][j].length()==len)  
                {  
                    lcs = lcs + "," + num[i][j];  
                }  
            }  
        }  
    }  
  
    for(int i=0;i<p;i++)      
    {      
        delete[] num[i];   
    }   
    delete[] num;  
  
    return lcs;  
}  
相關文章
相關標籤/搜索