您的位置:首页 > 其它

算法实现-->最长公共子串

2015-03-15 10:51 453 查看
/*
* 最长公共子串
* Longest Common SubString
*
*/
public class LCSS {

String str1,str2;

String sub;

LCSS(String str1,String str2){

this.str1=str1;
this.str2=str2;

}
public static void main(String []args){

String str1="BDCABABCBDA";
String str2="ABCBDAB";

LCSS lcss=new LCSS(str1,str2);

//	lcss.methodOne();

lcss.methodThree();
}
//字符串匹配算法
public boolean isMatch(String str,String sub){

int i=0,j=0;

while(i<sub.length()&&j<str.length()){

if(sub.charAt(i)==str.charAt(j)){

i++;
j++;

}else{

j++;
i=0;

}

}
if(i==sub.length()){
return true;
}

return false;
}
//暴力求解法2

public  void methodTwo(){

int maxlong=0;

for(int i=0;i<str1.length();i++){

for(int j=0;j<str2.length();j++){

int m=i;
int n=j;
int length=0;

while(m<str1.length()&&n<str2.length()){

if(str1.charAt(m)!=str2.charAt(n)) break;

m++;
n++;
length++;

}

if(length>maxlong){

maxlong =length;

}

}

}

}
//暴力求解法1
public void methodOne(){

int subLong=0;//子串的长度
int maxLong=0;//最大的长度
int flagi=-1,flagj=-1;
for(int i=0;i<str1.length();i++){

subLong=0;
int flag=0;
for(int j=0;j<str1.length()-i;j++){

System.out.println(str1.substring(i,i+j+1));

if(isMatch(str2,str1.substring(i,i+j+1))){
System.out.println("--->"+str1.substring(i,i+j+1));
subLong=subLong+1;
flag=j;

}

}
if(subLong>maxLong){
maxLong=subLong;
flagi=i;
flagj=flag;

}

}

System.out.println("Res:"+flagi+"--------"+flagj+"  ");

}

//动态规划求解法
public void methodThree(){

int [][]c=new int[str1.length()][str2.length()];

int flag=0;
for(int i=0;i<str1.length();i++){

if(str1.charAt(i)==str2.charAt(0)){
flag=1;
//	 break;
}else{

c[i][0]=0;

}

if(flag==1){
c[i][0]=1;
}

}
flag=0;
for(int j=0;j<str2.length();j++){

if(str2.charAt(j)==str1.charAt(0)){
flag=1;
c[0][j]=1;

}else{
c[0][j]=0;
}

if(flag==1){

c[0][j]=1;

}

}

for(int i=1;i<str1.length();i++){

for(int j=1;j<str2.length();j++){

if(str1.charAt(i)==str2.charAt(j)){

c[i][j]=c[i-1][j-1]+1;

}else{

c[i][j]=0;
}

}

}

int max=0;
int flagi=0,flagj=0;
for(int i=0;i<str1.length();i++){

for(int j=0;j<str2.length();j++){
if(c[i][j]>max){
flagi=i;
flagj=j;
max=c[i][j];

}

}

}

System.out.println(" ------->"+str1.substring(flagi-max+1, flagi+1));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐