算法实现-->最长公共子串
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)); } }
相关文章推荐
- 转【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS)&字符串相似度算法
- 算法12—动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- <算法书>最长前缀是逆串的子串
- 【字符串处理算法】获取最长公共子串的算法设计及C代码实现
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- [PHP]算法-最长公共子串的PHP实现
- LCS 最长公共子串算法实现 C#
- 【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS),字符串相似度算法
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
- LCS算法实现 求两个字符串中间最长的公共子串
- 实用算法实现-第 8 篇 后缀树和后缀数组 [2 最长公共子串]
- 算法题9 动态规划之最长公共子序列&amp;最长公共子串
- LCS算法找出两个字符串最长公共子串(C#实现)
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
- 实用算法实现-第 8 篇 后缀树和后缀数组 [2 最长公共子串]
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 实用算法实现-第 8 篇 后缀树和后缀数组 [4 最长回文子串]
- LCS算法求最长公共子串
- LCS算法求最长公共子串
- lcs.py 最长公共子串算法