编写函数,获取两段字符串的最长公共子串的长度
来源:互联网 发布:哪个软件可以看英剧 编辑:程序博客网 时间: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
- 编写函数,获取两段字符串的最长公共子串的长度
- 获取两个字符串之间最长公共子串的长度
- 两字符串最长公共子序列的长度
- 求两个字符串的最长公共子串的长度
- 求两个字符串的最长公共子串的长度
- 【每天学点算法题10.15】获取两个字符串之间最长公共子串的长度
- Poj 2774两个字符串的最长公共子串长度
- 求两个字符串中的最长公共子串的长度
- 求两个字符串公共子串的最长长度
- 求2个字符串的最长公共子串长度
- 求两个字符串最长公共子串的长度
- 两字符串的最长公共子串问题
- 求两字符串的最长公共连续子串
- 最长公共子串的长度
- 最长公共子串的长度
- 最长公共子串的长度
- 找两个字符串的最长公共子序列的长度
- 两个字符串的最长公共子序列的长度
- Non-ASCII character '\xb3' in file e:\python\ship.py on line 6, but no encoding declared;
- POJ3169(差分约束系统)
- 关于C++子类父类成员函数的覆盖和隐藏
- woj 1124 最大流
- PAT 甲级 1058. A+B in Hogwarts (20)
- 编写函数,获取两段字符串的最长公共子串的长度
- Java中的策略模式
- mysql中主外键关系
- 山东省第八届ACM程序设计竞赛----其中七道题的题解
- SpringMVC源码分析(二)之请求如何转发到对应的Controller
- 有些arp请求报文中为什么会有目的mac地址(不使用广播地址)
- 面向对象的第三个特征----多态I
- sqli-labs学习记录(二)
- 1038. 统计同成绩学生(20)