小言_互联网的博客

【每日蓝桥】48、一七年省赛Java组真题“最大公共子串”

338人阅读  评论(0)

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:最大公共子串

最大公共子串长度问题就是:

求两个串的所有子串中能够匹配上的最大长度是多少.

比如: "abcdkkk" 和"baabcdadabc",

可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4.

下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法.


   
  1. public class Main {
  2. static int f(String s1,String s2) {
  3. char[] c1 = s1.toCharArray();
  4. char[] c2 = s2.toCharArray();
  5. int [][]a = new int[c1.length+ 1][c2.length+ 1];
  6. int max = 0;
  7. for ( int i = 1; i < a.length; i++) {
  8. for ( int j = 1; j < a[i].length; j++) {
  9. if (c1[i -1]==c2[j -1]) {
  10. a[i][j] = ____________________; //填空
  11. if (a[i][j]>max) max=a[i][j];
  12. }
  13. }
  14. }
  15. return max;
  16. }
  17. public static void main(String[] args) {
  18. int n = f( "abcdkkk", "baabcdadabc");
  19. System. out.println(n);
  20. }
  21. }

请分析该解法的思路,并补全划线部分缺失的代码.

解题思路:

本题在求解时是利用动态规划的思想进行求解的,

我们以字符串“aabck”和“ababcd”为例来进行讲解,利用矩阵法将这两个字符串表示出来:

当两个字符匹配成功之后,那么二维数组中对应的位置就会记录匹配成功的字符的长度,至于对应位置上的长度数据是怎么来的,观察这个矩阵可以发现,其实每一个数据都是由它对应的左上角的数据加1得到的,也就是说a[i][j] = a[i-1][j-1]+1,每当匹配完成之后就判断当前匹配的长度是否大于max,如果大于,那么相同子串的长度就是当前已经匹配的长度。

答案源码:


   
  1. public class Year2017_Bt6 {
  2. static int f(String s1,String s2) {
  3. char[] c1 = s1.toCharArray();
  4. char[] c2 = s2.toCharArray();
  5. int [][]a = new int[c1.length+ 1][c2.length+ 1];
  6. // "abcdkkk" 和"baabcdadabc",
  7. int max = 0;
  8. //利用循环来进行动态规划,模拟矩阵中的匹配过程
  9. for ( int i = 1; i < a.length; i++) {
  10. for ( int j = 1; j < a[i].length; j++) {
  11. //如果两个字符匹配成功
  12. if (c1[i- 1]==c2[j- 1]) {
  13. a[i][j] = a[i- 1][j- 1]+ 1; //填空
  14. //判断当前字符的长度是否大于已经匹配到的串的长度
  15. if (a[i][j]>max) max=a[i][j];
  16. }
  17. }
  18. }
  19. return max; //返回匹配到的最长的字符串
  20. }
  21. public static void main(String[] args) {
  22. int n = f( "abcdkkk", "baabcdadabc");
  23. System.out.println(n);
  24. }
  25. }

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

 


转载:https://blog.csdn.net/weixin_44985880/article/details/115310696
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场