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