求两个字符串的最大连续公共字串

来源:互联网 发布:web数据库测试 编辑:程序博客网 时间:2024/05/17 09:02

如下两个字符串,公共连续字符串为abcdf,求出这个abcdf,

"aaffffsfabcdfasf", "aaaadfsabcdfsdb"


假设字符串长度分别为m,n,这个题有个m*n*min(m,n)复杂度的方法,这个方法比较慢,暂时不考虑。

另一个种方法是动态规划:

设置二维数组dp[][], dp[i][j]==0表示第一个字符串的第i个字符与第二个字符串的第j个字符不相等,dp[i][j]!=0表示第一个字符串的第i个字符与第二个字符串的第j个字符串相等,并且,如果dp[i][j]==k,不仅当前字符相等,前面k-1个也相等,也就是dp的公式为dp[i][j] = dp[i-1][j-1]+1。最终二维矩阵的结果如下所示(随机写的):

00010010

01000000

00201000

01030010

11014101


public static String getMaxString(String s1, String s2){
 if(s1.length() == 0 || s1 == null || s2.length() == 0 || s2 == null){
            return null;  
 }
 int length1 = s1.length();
 int length2 = s2.length();
 int max =0;
 int positionI = 0;
 int[][] value = new int [length1 + 1][length2 + 1];
 for(int i = 1; i < length1 + 1 ; i++){
 for(int j = 1; j < length2 + 1; j++ ){
 if(s1.charAt(i - 1) == s2.charAt(j - 1)){
 value[i][j] = value[i - 1][j - 1] + 1;
 if(max < value[i][j]){
 max = value[i][j];
 positionI = i;
 }
 }
 }
 }
 return (s2.substring(positionI - max , positionI));
  }
  public static void main(String args[]){
 String s1 = "baac";
 String s2 = "caab";
 System.out.println(getMaxString(s1, s2));
  }

阅读全文
0 0
原创粉丝点击