求最長公共子串問題

 

n個字符串,1<n<20;找出n個字符串中相同的最長的子字符串;
如n=3
1.what is local bus?
2.this is local bus。
3.local bus is name sdhfj。
那麼最長的共同子串是local bus
函數爲char * findchar(const char**asd,const int n)
大體就是這些,用c去實現!!
大牛們 給力啊!!

看到個跟帖的代碼,

PS:方案爲 1:找到 N 個字符串中最短的.

                  2.foreach( minStr 的所有子串){與 N 個字符串 匹配} 並記錄下長度

                  3.  maxLen< i-j-1 爲修枝, 諾可能出現的子串 比 匹配成功的 maxLeb 小, 則無接着比較的意義.

收穫:有些問題不是要求很高的話,沒必要糾結與某些特定的算法,先實現在說,諾 效率達不到在進行修改.

        並且在實現過一次的基礎上做起來,更有路和把握.

上代碼

#include <iostream>
#include <string>

using namespace std;

//將第一個字符串與最短的字符串交換
void swap(string *pStr,int i)
{
    string temp;
    temp = *pStr;
    *pStr = *(pStr + i);
    *(pStr + i) = temp;
}

int main()
{
    int N = 3;
    
    //cout << "請輸入N(控制字符串個數):";
    //cin >> N;
    //cout << "請輸入" << N << "個字符串"<<endl;

    string *pStr;

    pStr = new string [N];//記錄要查找的字符串

    pStr[0] = "main what is local bus";

    pStr[1] = "main this is local bus";

    //pStr[2] = "local bus is name sdhfj";
    pStr[2]  = "main";

    int i,min;
    int maxLen = 256;
    //找出輸入的字符串中長度最小的串,並把最小串序號記在min中
    for(i = 0; i < N; ++i){
       // cin >> *(pStr + i);
        int len = (*(pStr +i)).length();// *操作符與調用函數的.操作符優先級問題,.優先級高於*,所以必須加上()
        if(len < maxLen){
            maxLen = len;
            min = i;
        }
    }
    swap(pStr,min);
    /*
    for(i = 0; i < N; ++i)
        cout << *(pStr + i) << endl;
    */
    
    int len0 = pStr[0].length();
    int j,k,maxlen= 0;
    string maxStr;
    string tmpStr;
    for(i = 0; i < len0 && maxlen <= len0 - i -1; ++i)
    {
        for(j = 0; j < len0 && maxlen <= len0 - i -j - 1; ++j)
        {
            tmpStr = pStr[0].substr(i,len0 - j);//對字符串數組中第一個子串,求出其可能的子串值,如果剩餘子串長度小於maxlen則不用去求了,for循環中給出了限制
            //將子串tmpStr與參與匹配的字符串比較,判斷tmpStr是否爲剩餘串的子串,如果不是則break出循環
            for(k = 1; k < N; ++k)
            {
                string::size_type pos1 = pStr[k].find(tmpStr);
                if(pos1 < pStr[k].length())
                    continue;
                else
                    break;
            }
            if(k == N)//說明子串tmpStr是其他參與匹配的子串的子串
            {
                if(tmpStr.length() > maxlen)//tmpStr如果是當前最大的子串,則記錄下來
                {
                    maxlen = tmpStr.length();
                    maxStr = tmpStr;
                }
            }
        }
    }
    cout << "最大公共子串爲:";
    cout << maxStr <<endl;
    delete []pStr;
    return 0;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章