华为OD机试真题 JavaScript 实现【查找两个字符串a,b中的最长公共子串】【牛客练习题】

在这里插入图片描述

一、题目描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

数据范围:字符串长度1≤length≤300 。

二、输入描述

输入两个字符串。

三、输出描述

返回重复出现的字符。

四、解题思路

  1. 首先读取输入的两个字符串;
  2. 判断哪个字符串更短,将其作为短串,另一个字符串作为长串;
  3. 获取短串和长串的长度;
  4. 初始化变量 maxLen 和 start,分别用于记录最长公共子串的长度和起始位置;
  5. 使用两层循环,外层循环遍历短串,内层循环遍历短串中的子串;
  6. 在每次内层循环中,判断当前子串是否是长串的子串,并且比较其长度是否大于之前记录的最大长度;
  7. 如果满足条件,更新最大长度 maxLen 和起始位置 start;
  8. 循环结束后,根据最大长度和起始位置在短串中提取出最长公共子串,并输出。

五、JavaScript算法源码

function calculate(s1, s2) {
    // 短串
    const shortStr = s1.length < s2.length ? s1 : s2;
    // 长串
    const longStr = s1.length > s2.length ? s1 : s2;
    const shortLen = shortStr.length;
    const longLen = longStr.length;
    // 最长公共子串的长度
    let maxLen = 0;
    // 最长公共子串起始位置
    let start = 0;

    // 循环遍历短串
    for (let i = 0; i < shortLen; i++) {
        if (shortLen - i + 1 <= maxLen) {
            break;
        }
        // 循环遍历短串中的子串
        for (let j = i, k = shortLen; k > j; k--) {
            const subStr = shortStr.substring(i, k);
            // 在每次内层循环中,判断当前子串是否是长串的子串,并且比较其长度是否大于之前记录的最大长度
            if (longStr.includes(subStr) && maxLen < subStr.length) {
                // 如果满足条件,更新最大长度 maxLen 和起始位置 start
                maxLen = subStr.length;
                start = j;
                break;
            }
        }
    }

    // 根据最大长度和起始位置在短串中提取出最长公共子串,并输出
    return shortStr.substring(start, start + maxLen);
}

六、效果展示

华为OD机试真题 JavaScript 实现【查找两个字符串a,b中的最长公共子串】【牛客练习题】_第1张图片


下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,javascript,java,算法,学习)