• HJ65 查找两个字符串a,b中的最长公共子串


    题目:

    HJ65 查找两个字符串a,b中的最长公共子串

    题解:

    一、暴力枚举

    1. 枚举求出较短串的所有子串
    2. 遍历所有子串,判断长串是否包含子串
    3. 记录最长子串
    1. private String getMaxSubString2(String s1, String s2) {
    2. String longgerString = s1.length() > s2.length() ? s1 : s2;
    3. String shorterString = s1.length() > s2.length() ? s2 : s1;
    4. char[] chars1 = shorterString.toCharArray();
    5. List subStringSet = new ArrayList<>();
    6. for (int i = 0; i < chars1.length; i++) {
    7. for (int j = i+1; j <= chars1.length; j++) {
    8. subStringSet.add(shorterString.substring(i, j));
    9. }
    10. }
    11. String result = "";
    12. for (String s : subStringSet) {
    13. if (longgerString.contains(s) && s.length() > result.length()) {
    14. result = s;
    15. }
    16. }
    17. return result;
    18. }

    时间复杂度:O(n^{2})

    二、滑动窗口

    1. 遍历段串,每个字符作为子串起始字符
    2. 从长串中找到对应字符,依次向后遍历
    3. 记录相同子串长度,遇到字符不相等就枚举下个字符作为起始字符
    1. private String getMaxSubString(String s1, String s2) {
    2. if (s1.length() > s2.length()) {
    3. String temp = s1;
    4. s1 = s2;
    5. s2 = temp;
    6. }
    7. char[] chars1 = s1.toCharArray();
    8. char[] chars2 = s2.toCharArray();
    9. String result = "";
    10. for (int i = 0; i < chars1.length; i++) {
    11. char char1 = chars1[i];
    12. for (int j = 0; j < chars2.length; j++) {
    13. char char2 = chars2[j];
    14. if (char1 != char2) {
    15. continue;
    16. }
    17. int index1 = i;
    18. int index2 = j;
    19. while (index1 < chars1.length && index2 < chars2.length && chars1[index1] == chars2[index2]) {
    20. index1++;
    21. index2++;
    22. }
    23. String substring = s1.substring(i, index1);
    24. if (substring.length() > result.length()) {
    25. result = substring;
    26. }
    27. }
    28. }
    29. return result;
    30. }

    时间复杂度:O(n^{2}*m)

    三、动态规划

    设dp[i][j]表示 s1 位置 i 与 s2 位置 j 之间最长子串长度,那么可得dp方程:

    1. dp[i][j] = dp[i-1][j-1] + 1 (s1[i-1] == s2[j-1])
    2. dp[i][j] = 0 (s1[i-1] != s2[j-1])

    1. private String getMaxSubStringForDP(String s1, String s2) {
    2. if (s1.length() > s2.length()) {
    3. String temp = s1;
    4. s1 = s2;
    5. s2 = temp;
    6. }
    7. char[] chars1 = s1.toCharArray();
    8. char[] chars2 = s2.toCharArray();
    9. int len1 = chars1.length;
    10. int len2 = chars2.length;
    11. int[][] dp = new int[len1+1][len2+1];
    12. int maxLength = 0;
    13. int index = 0;
    14. for(int i = 1; i <= len1; i++) {
    15. for (int j = 1; j <= len2; j++) {
    16. if (chars1[i-1] == chars2[j-1]) {
    17. dp[i][j] = dp[i-1][j-1] + 1;
    18. if (dp[i][j] > maxLength) {
    19. maxLength = dp[i][j];
    20. index = i;
    21. }
    22. }
    23. }
    24. }
    25. return s1.substring(index-maxLength, index);
    26. }

    时间复杂度:O(n*m)

  • 相关阅读:
    windows使用命令行创建文件echo >test.txt(可以是.gp .js .ts..)
    for深入学习
    百趣代谢组学文献分享:茶褐素可促进胆固醇降解
    5分钟,ArcGIS 简单几步从天地图中提取出建筑物轮廓的矢量数据
    JavaScript 函数柯里化
    DDD领域驱动的核心概念
    排序-表排序
    采购策略中的合同支付类型
    C++--智能指针--1123
    金蝶云星空各种部署架构及适用场景分享
  • 原文地址:https://blog.csdn.net/PZHU_CG_CSDN/article/details/133246006