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;
}