C语言实现:
穷举法:
#include <iostream.h>//穷举法计算最大公共子字符串
#define M 100
typedef struct
{
char str[M];
int length;
}seqstring;
int len_link(seqstring p)
{
int i=0,length=0;
while(p.str[i]!='\0')
{
i++;
length++;
}
return (length);
}
void same(seqstring p,seqstring s)
{
seqstring r;
int i=0,l,m,n=0,k;
while(i<p.length)//用穷举法求最大公共子字符串
{
int j=0;
while(j<s.length)
{
if(p.str[i]==s.str[j])//以p为基准
{
l=1;
for(m=1;i+m<p.length&&j+m<s.length&&p.str[i+m]==s.str[j+m];m++)//寻找相等的
{
l++;//记录相等字符的个数
}
if(l>n)
{
k=i;//记录公共字符串的起点位置
n=l;//记录公共字符串的个数
}
j=j+l;
}
else
{
j++;
}
}
i++;
}
if(n>0)
{
for(i=0;i<n;i++)
{
r.str[i]=p.str[i+k];
r.length=n;
}
}
else
{
cout<<"无!";
}
for(i=0;i<n;i++)
{
cout<<r.str[i];
}
cout<<endl;
}
void main()
{
seqstring p,s;//结构体
cout<<"请输入第一个字符串元素:";
cin>>p.str;
cout<<"请输入第二个字符串元素:";
cin>>s.str;
p.length=len_link(p);
s.length=len_link(s);
cout<<"最大公共子串为:";
same(p,s);
}
java语言实现:
基本思想是从最大字符串开始比较
先选择两个字符串中 较小的一个并以其为基准 然后由大开始向小进行比较 找到的第一个就是最大的。
import java.sql.DriverManager;
public class Abc {
public static String getSubString(String s1, String s2) {
if (s1.length() > s2.length()) {
String temp = s1;
s1 = s2;
s2 = temp;
}
int n = s1.length();
int index = 0;
ok: for (; n > 0; n--) {
for (int i = 0; i < s1.length() - n + 1; i++) {
String s = s1.substring(i, i + n);
if (s2.indexOf(s) != -1) {
index = i;
break ok;
}
}
}
return s1.substring(index, index + n);
}
public static void main(String[] args) throws Exception {
String a="abnajfkabcdefghijklmnkajftwtlkwrejtrewq";
String b="jljafabcdefghijklmnlkfjieoijjflja";
String result=getSubString(a,b);
System.out.println("result============="+result);
}
}