/*
* 最长公共子串
* 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));
}
}
算法实现-->最长公共子串
最新推荐文章于 2021-12-13 15:33:58 发布
