寻找最长公共子串(高分)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找最长公共子串(高分)相关的知识,希望对你有一定的参考价值。
C语言实现,就是从多个字符串中寻找公共子串,公共子串只要是字符串的子串或是字符串反顺序的子串也行,改怎么办啊?最好算法有详细的示例...如果完美解决再送分
大家的都是两个字符串的比较,我觉得多个和两个不太一样,而且都没有注意到字符串反序!!!!也是可以的... 加一点...只要求公共子串长度就可以了....
程序已做修改,对多个字符串求最长公共子串。思路和求两个字符串公共子串相似。原因是:多个字符串的公共子串首先必须是任何两个字符串的公共子串。所以只需要先求出两个字符串的最长公共子串然后用此子串再和其他字符串再求最长公共子串,最后的最长公共子串即是结果。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N = 1024;
const int M = 256;
void MaxSubString(char* str1,char* str2,char* s)
int i, j, k, index, max=0;/* 公共子串长度初始化为0 */
for(i=0; str1[i]; i++)
for(j=0; str2[j]; j++)
for(k=0; str1[i+k]==str2[j+k] && (str2[j+k] || str1[i+k]); k++)
; /* 此循环求公共子串的长度,长度为k */
if(k>max) /* 如果出现大于当前子串长度的子串,则替换子串位置和长度 */
index = j;
max = k;
for(i=0; i<max; i++)
s[i] = str2[index++];/* 求出最长公共子串 */
s[i]='\0';
int main(void)
int i,n;
char str[M][N],str1[N],s[N]; /* s[N]保存最长公共子串 */
while(1)
puts("Please input the number of strings:");
if(scanf("%d",&n)==1) /*剔除输入格式错误并输入字符串个数n*/
break;
fflush(stdin); /*清键盘缓冲区*/
fflush(stdin); /*由于下面fgets()函数和gets()函数一样是从键盘缓冲区取得字符,故这里先清空键盘缓冲区,否则会少一次输入*/
printf("Please input %d strings:\n",n); /* 输入n个字符串 */
for(i=0;i<n;i++)
fgets(str[i],N,stdin); /*用安全可靠的函数fgets()取代不安全的gets()函数*/
strcpy(str1,str[0]); /* str1初值为str[0] */
for(i=1;i<n;i++)
MaxSubString(str1, str[i],s);/* 两两字符串找最长公共子串 */
strcpy(str1,s);/* s复制给str1再找 */
printf("MaxSubString: %s\n",s);/* 打印出最长公共子串 */
printf("length=%d\n",strlen(s)); /* 打印出最长公共子串长度 */
system("pause");
return 0;
参考技术A 我是北京某大学的学生,前天实习时完美解决了此题。
这里人多,我怕暴露了身份
http://netalpha.javaeye.com/blog/340554
相对的,如果您有另一题的编码,就是解释程序的,请务必告诉我。
现有一些由英文字符组成的大小写敏感的字符串。编写一个程序,找到一个最长的字符串x,使得:对于已经给出的字符串中的任意一个y, x或者是y的子串、或者x中的字符反序之后得到的新字符串是y的子串。
参考资料:http://netalpha.javaeye.com/blog/340554
本回答被提问者采纳 参考技术B #include<iostream>using namespace std;
int len(char *a,char *b)
int la,lb;
int i,j;
int c[1002][1002];
la=strlen(a);
lb=strlen(b);
for(i=0;i<=la;i++) c[i][0]=0;
for(j=0;j<=lb;j++) c[0][j]=0;
for(i=1;i<=la;i++) //注意你开始的算法,当a[0]=b[0]时的c[0][0]=c[-1][-1]+1
for(j=1;j<=lb;j++)
if(*(a+i-1)==*(b+i-1))
c[i][j]=c[i-1][j-1]+1;
else
c[i][j]=c[i-1][j]>c[i][j-1]?c[i-1][j]:c[i][j-1];
return c[la][lb];
int main()
int n,l,T;
char s1[1001];
char s2[1001];
cin>>T;
if(T<1||T>100)
return 0;
while(T--)
cin>>s1;
cin>>s2;
cin>>n;
l=len(s1,s2);
if(l>=n)
cout<<"Not Smaller"<<endl;
else
cout<<"Smaller"<<endl;
return 0;
——————————————————————————
还有一个
1using System;
2using System.Collections;
3namespace CompareString_AX
4
5 /**//// <summary>
6 /// Class1 的摘要说明。
7 /// </summary>
8 class Class1
9
10 /**//// <summary>
11 /// 应用程序的主入口点。
12 /// </summary>
13 [STAThread]
14 static void Main(string[] args)
15
16 string a="AX_skljfgfdeerterter";//12315aaa1aaaa1211213412222";
17 string b="AX_weesdfsdee1";//31222aaaa1aaa1113412222";
18 ArrayList AX=Compare(a,b);
19 foreach(string i in AX)
20
21 Console.WriteLine("最长的子串为:"+i);
22
23 Console.ReadLine();
24
25 public static ArrayList Compare(string a,string b)
26
27 ArrayList arr=new ArrayList();
28 arr.Add("");
29 //循环遍历字符串a
30 for(int i=0;i<a.Length;i++)
31
32 //在字符串b中查找从匹配上a[i]开始的子串
33 //优化循环次数(有点问题)for(int j=0;j<b.Length-arr[0].ToString().Length+1;j++)
34 for(int j=0;j<b.Length;j++)
35
36 int n=1;//计数器
37 string subTemp="";//保存匹配上的临时子串
38 char tempa=a[i];
39 char tempb=b[j];
40 //匹配上后,两字符串的字符同时后移一位,再进行匹配,直到匹配不上
41 while(tempa==tempb)
42
43 subTemp+=tempa;
44 if((i+n)<a.Length&&(j+n)<b.Length)
45
46 tempa=a[i+n];
47 tempb=b[j+n];
48 n++;
49
50 else
51
52 break;
53
54
55 //比较子串与临时子串的长度
56 if(subTemp.Length>arr[0].ToString().Length&&subTemp.Length!=0)
57
58 arr.Clear();
59 arr.Add(subTemp);
60
61 else if(subTemp.Length==arr[0].ToString().Length&&subTemp.Length!=0)
62
63 arr.Add(subTemp);
64
65
66
67 //设置返回值
68 if(arr[0].ToString().Length!=0)
69
70 return arr;
71
72 else
73
74 arr.Clear();
75 arr.Add("没有共同的子串!");
76 return arr;
77
78
79
80
81
——————————————————————————
还有一个
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int longest_length_of_comstr(char *str1, char *str2);
int find_the_longest_comstr(char *str1, char *str2);
int find_the_longest_comstr(char *str1, char *str2)
int maxlen=longest_length_of_comstr(str1,str2);
int len;
int num=strlen(str1) > strlen(str2) ? strlen(str1)+1 : strlen(str2)+1;
char *p,*q,*tmp1,*tmp2,*maxi;
char *comstr=(char *)malloc(sizeof(char)*num);
for (q=str1; *q!=0; q++)
for (p=str2; *p!=0; p++)
len=0;
tmp1=q;
tmp2=p;
while (*tmp1 && *tmp2 && *tmp1==*tmp2)
tmp1++;
tmp2++;
len++;
if(len == maxlen)
maxlen=len;
maxi=q;
strncpy(comstr,maxi,maxlen);
*(comstr+maxlen)=0;
printf("%s\n",comstr);
break;
free(comstr);
return 0;
int longest_length_of_comstr(char *str1, char *str2)
int maxlen=0;
int len;
char *p,*q,*tmp1,*tmp2;
for (q=str1; *q!=0; q++)
for (p=str2; *p!=0; p++)
len=0;
tmp1=q;
tmp2=p;
while (*tmp1 && *tmp2 && *tmp1==*tmp2)
tmp1++;
tmp2++;
len++;
if(len > maxlen)
maxlen=len;
return maxlen;
int main(void)
char a[]="abcaadybc";
char b[]="kbcdadwbc";
find_the_longest_comstr(a,b);
return 0;
_____________________________________________________
看你选哪个了
如果我的答案满意的话请多加点分O(∩_∩)O~ 参考技术C 哈哈,那么多人都搞那么复杂。楼主我也不给你写程序了。给你简述一下,看你能否理解,十分简单。
对所有字符串进行一遍扫描构建一个后缀树,用图论找到一个最大通路就是最长公共子串了。
最长公共子串
一、最长公共子串和最长公共子序列的区别
最长公共子串:要求子串在原字符串中是连续出现的。 ADE 和ABCDE的最长公共子串是DE
最长公共子序列:不要求子序列在原字符串中是连续的。ADE 和ABCDE的最长公共子序列是ADE
二、最长公共子串
字符串1:caba
字符串2:bab
思路:
1.用一个二维数组存储两个字符串的字符是否相等。对角线上连续为1 的最长的序列即为最长公共子串。
2.如何寻找对角线上连续为1的最长序列?
数组中存储的每一元素的取值为:
若匹配成功,值为1加上 该元素的左上元素的取值(即上一行中的左邻元素)
若匹配不成功,取值为0
以上是关于寻找最长公共子串(高分)的主要内容,如果未能解决你的问题,请参考以下文章