发个求最大公串的问题,大家讨论下。

kesaihao862 2008-03-17 08:17:46

5.编写一个函数,返回两个字符串的最大公串!例如,“adbccadebbca”和“edabccadece”,返回“ccade”
...全文
259 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kesaihao862 2008-10-01
  • 打赏
  • 举报
回复
richbirdandy 2008-10-01
  • 打赏
  • 举报
回复
NND 原来是挖坟
richbirdandy 2008-10-01
  • 打赏
  • 举报
回复
除了DP还可以用后缀树 不过用线性时间构造后缀树比较麻烦 kmp不适于这个问题
richbirdandy 2008-10-01
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;

void printLCS(char* a,int maxLen,int maxIndex)
{
char* begin=a+maxIndex-maxLen+1;
for(int i=0;i<maxLen;i++)
{
cout<<*begin;
++begin;
}
}
void LCS(char* a,int alen,char* b,int blen)//动态规划解法,O(n^2)
{
int* n=new int[alen];//记录匹配的数组
for(int k=0;k<alen;k++)
n[k]=0;//初始化
int maxIndex=0;//记录最大公共子串的最后位置,这里只纪录一个最长公共子串
int maxLen=0;//记录最大公共子串长度
for(int j=0;j<blen;j++)
{
int i;
for(i=alen-1;i>0;i--)//这里必须从后往前遍历,不然会丢掉先前的记录
{
if(a[i]==b[j])
{
n[i]=n[i-1]+1;
if(maxLen<n[i])
{
maxLen=n[i];
maxIndex=i;
}

}
else
n[i]=0;
}
if(a[i]==b[j])//处理i=0的情况
n[i]=1;
}
delete [] n;
printLCS(a,maxLen,maxIndex);
}


int main()
{
char* a="adbccadebbca";
char* b="edabccadece";
LCS(a,strlen(a),b,strlen(b));
system("pause");
}
richbirdandy 2008-10-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wjb_yd 的回复:]
2,3楼是错的,用kmp
[/Quote]
你错了。。。
wjb_yd 2008-10-01
  • 打赏
  • 举报
回复
2,3楼是错的,用kmp
study_live 2008-10-01
  • 打赏
  • 举报
回复

int main()
{
char a[] = "adbccadebbca", b[] = "edabccadece";
char c[100] = {0};
int iMax = 0;

size_t ia = strlen(a), ib = strlen(b);

for (size_t i = 0; i<ia; i++)
{
char *pa = a+i;
for (size_t j = 0; j<ib; j++)
{
char *pb = b+j;
int m = 0;
int bcompare = strncmp(pa, pb, 1);

while (!bcompare)
{
m++;
if (m+j>=ib)
{
break;
}

bcompare = strncmp(pa+m, pb+m, 1);
}

if (m>iMax)
{
memset(c, 0, 100);
strncpy(c, pa, m);
cout<<c<<endl;
iMax = m;
}

j+=m;
}
}

cout<<c<<endl;
cout<<iMax<<endl;
system("pause");
}



应该是"adbccade", 而非“ccade”
luxiaoxun 2008-10-01
  • 打赏
  • 举报
回复
solar 2008-10-01
  • 打赏
  • 举报
回复
有点难度
kesaihao862 2008-03-20
  • 打赏
  • 举报
回复
这个上面的两个都没看懂,谁能讲的再详细点吗,谢谢
bjjfirst 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xmuyong 的回复:]
动态规划
设X = (x1,x2,...,xm),Y = (y1,y2,...,yn),


c[i,j] = 0 (if i = 0 or j = 0)
c[i,j] = c[i - 1,j-1] (if j,i> 0 and xi = yj)
c[i,j] = max(c[i,j-1],c[i-1,j]) (if i,j> 0 and xi != yj)
[/Quote]

c[i,j] = 0 (if i = 0 or j = 0)
c[i,j] = c[i - 1,j-1]+ 1 (if j,i> 0 and xi = yj) //这一行
c[i,j] = max(c[i,j-1],c[i-1,j]) (if i,j> 0 and xi != yj)
xmuyong 2008-03-17
  • 打赏
  • 举报
回复
动态规划
设X = (x1,x2,...,xm),Y = (y1,y2,...,yn),


c[i,j] = 0 (if i = 0 or j = 0)
c[i,j] = c[i - 1,j-1] (if j,i>0 and xi = yj)
c[i,j] = max(c[i,j-1],c[i-1,j]) (if i,j>0 and xi != yj)
canybox 2008-03-17
  • 打赏
  • 举报
回复
以前的老贴,kmp算法的

http://topic.csdn.net/t/20060821/21/4965574.html

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧