• 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)

  • 相关阅读:
    REDIS00_SpringBoot整合redis、RedisTemplate使用、工具类的抽取
    使用阈值调优改进分类模型性能
    【云原生】Java 处理 Excel:从 POI 到 SPL
    淘宝/天猫获得淘宝商品评论 API 返回值说明
    ARP欺骗
    【技术分享】SLA(服务等级协议)原理与配置
    8.5 数据结构——归并排序和基数排序
    测试工作中的测试用例设计
    K8s技术全景:架构、应用与优化
    开源 AI 智能名片 S2B2C 商城小程序赋能下的社区团购商业模式研究
  • 原文地址:https://blog.csdn.net/PZHU_CG_CSDN/article/details/133246006