解题思路

  1. str1 和 str2 有 1 个是空字符串,最长公共子串是 ‘’
    2. 两层 for 循环
    3. 第 1 层 for 循环是个指针,代表从 str1 第几个字符开始查找公共子串
    4. 第 2 层 for 循环代表查找的子串结尾索引
    5. 判断 str1 子串是否是 str2 的子串,如果是计算最大长度,记录公共子串

    图解

  2. 指针 i 移动

  3. 子串结尾索引 j 增加
  4. 判断公共子串

最长公共子串 - 图1

代码

  1. /**
  2. * 解题思路:
  3. * 1. str1 和 str2 有 1 个是空字符串,最长公共子串是 ''
  4. * 2. 两层 for 循环
  5. * 3. 第 1 层 for 循环是个指针,代表从 str1 第几个字符开始查找公共子串
  6. * 4. 第 2 层 for 循环代表查找的子串结尾索引
  7. * 5. 判断 str1 子串是否是 str2 的子串,如果是计算最大长度,记录公共子串
  8. */
  9. function longestCommonStr(str1, str2) {
  10. // 最长公共子串
  11. let maxStr = '';
  12. // 最长公共子串长度
  13. let maxLength = 0;
  14. // 代表从 str1 第几个字符开始查找公共子串
  15. for (let i = 0; i < str1.length; i++) {
  16. // 代表查找的子串结尾索引
  17. for (let j = i; j < str1.length; j++) {
  18. // 截取当前子串,substring 截取时不包含第二个参数的索引
  19. const current = str1.substring(i, j + 1);
  20. // str2 包含该子串,则为公共子串,计算长度,记录公共子串
  21. if (str2.indexOf(current) > -1) {
  22. if (current.length > maxLength) {
  23. maxLength = current.length;
  24. maxStr = current;
  25. }
  26. }
  27. }
  28. }
  29. return maxStr;
  30. }
  31. const str1 = 'abcdefghki';
  32. const str2 = 'afgh000';
  33. console.log(longestCommonStr(str1, str2)); // 'fgh'