龙空技术网

算法:最长公共子串

京会健康好食 178

前言:

如今同学们对“求最大公共子串 c语言”可能比较关心,朋友们都想要知道一些“求最大公共子串 c语言”的相关知识。那么小编在网上汇集了一些关于“求最大公共子串 c语言””的相关资讯,希望各位老铁们能喜欢,看官们一起来学习一下吧!

描述

给定两个字符串str1和str2,输出两个字符串的最长公共子串

题目保证str1和str2的最长公共子串存在且唯一。

示例1

输入:

"1AB2345CD","12345EF"

复制

返回值:

"2345"

思路:(动态规划)

1、把两个字符串分别以行和列组成一个二维矩阵。

2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。

3、通过查找出值为1的最长对角线就能找到最长公共子串。

比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。

针对于上面的两个字符串我们可以得到的二维矩阵如下:

从上图可以看到,str1和str2共有5个公共子串,但最长的公共子串长度为5。

为了进一步优化算法的效率,我们可以再计算某个二维矩阵的值的时候顺便计算出来当前最长的公共子串的长度,即某个二维矩阵元素的值由record[i][j]=1演变为record[i][j]=1 +record[i-1][j-1],这样就避免了后续查找对角线长度的操作了。修改后的二维矩阵如下:

代码:

import java.util.*;public class Solution {        public String LCS (String str1, String str2) {              if(str1 ==null || str2 ==null){            return "-1";        }        int leng1=str1.length();        int leng2=str2.length();        int maxi=0; //记录最大匹配的纵坐标        int maxj=0; //记录最大匹配的横坐标        int max=0; //记录最大匹配数                int aa[][]=new int[leng1][leng2];        for(int i=0;i<leng2;i++){            String s2=str2.substring(i,i+1);            for(int j=0;j<leng1;j++){                String s1=str1.substring(j,j+1);                if(s2.equals(s1)){                                        if(j>0 && i>0){                        aa[j][i]=aa[j-1][i-1]+1;                    }else{                        aa[j][i]=1;                    }                    if(aa[j][i]>max){                        max=aa[j][i];                        maxj=j;                        maxi=i;                    }                }            }        }                if(max>0){            return str1.substring(maxj-max+1,maxj+1);        }        return "-1";    }}

标签: #求最大公共子串 c语言 #求最长公共子字符串 #最近最久算法