编写函数,获取两段字符串的最长公共子串的长度

来源:互联网 发布:哪个软件可以看英剧 编辑:程序博客网 时间:2024/05/17 07:37

题目:编写函数,获取两段字符串的最长公共子串的长度


例如:
S1 = GCCCTAGCCAGDE
S2 = GCGCCAGTGDE
这两个序列的最长公共字串为GCCAG,也就是说返回值为5。

参数:str1和str2表示两个字符串
返回值:返回两段字符串的最长公共子串的长度

int findLargestSizeString(String str1, String str2)


此题为动态规划问题,在笔试题中遇到,开始想法为暴力穷举,参考资料,归类为【动态规划】问题。时间复杂度O(M*N) 额外空间复杂度为O(M*N),经过优化可将空间复杂度降为O(1)。动态规划:1.生成动态规划表 M*N的矩阵2.dp[i][j]的含义为在必须以arr1[i]和arr2[j]当作公共子串最后一个字符的情况下,公共子串的长度。

这里写图片描述

dp矩阵:
这里写图片描述

求解dp矩阵==》getDp()

int [][]getdp(char []arr1,char []arr2)    {        int [][]dp = new int [arr1.length][arr2.length];        for(int i = 0;i<arr1.length;++i) //第一列赋值        {            if(arr1[i] == arr2[0])            {                dp[i][0] = 1;            }        }        for(int j = 1;j<arr2.length;++j) // 第一行赋值        {            if(arr2[j]==arr1[0])            {                dp[0][j]=1;            }        }        for(int i = 1;i<arr1.length;++i)  // 其余位置相等的赋值为 左上角加1 ==》当前子串长度        {            for(int j = 1;j<arr2.length;++j)            {                if(arr1[i]==arr2[j])                {                    dp[i][j] = dp[i-1][j-1]+1;                }            }        }        return dp;    }
int findLargestSizeString(String str1, String str2)    {        if(str1==null || str2==null ||str1.equals("") ||str2.equals(""))        {        return -1;        }        char [] arr1 = str1.toCharArray();        char [] arr2 = str2.toCharArray();        int [][] dp= getdp(arr1,arr2);        int end = 0;        int maxlen = 0;        for(int i = 0; i<arr1.length;++i)        {            for(int j = 0;j<arr2.length;++j)            {                if(dp[i][j] > maxlen)  // 如果所在值大于 maxlen                {                    end = i;             // end 即为结束子串的位置下标                    maxlen = dp[i][j];         // 更新maxlen                 }            }        }        String subs = str1.substring(end-maxlen+1, end+1);         System.out.println("两个字符串的最长相同子串:"+subs);        return maxlen;    }

测试代码:

public static void main(String[] args){        String str1 ="GCCCTAGCCAGDE";        String str2 = "GCGCCAGTGDE";        HelloWorld h = new HelloWorld();        int len = h.findLargestSizeString(str1, str2);        System.out.println("len:"+len);    }

结果:
这里写图片描述

阅读全文
0 0