,

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

描述 对于给定的两个字符串 ss 和 tt,你需要找出它们的最长公共子串。特别地…

描述

对于给定的两个字符串 ss 和 tt,你需要找出它们的最长公共子串。特别地,如果存在多个答案,输出在较短串中最先出现的那个。

子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
如果字符串 aa 的一个子串 aa′ 与字符串 bb 的一个子串 bb′ 完全相等,那么子串 a,ba′,b′ 是字符串 a,ba,b 的一个公共子串。

输入描述:

第一行输入一个长度为 1len(s)3001≦len(s)≦300、仅由小写字母组成的字符串 ss
第二行输入一个长度为 1len(t)3001≦len(t)≦300、仅由小写字母组成的字符串 tt

输出描述:

输出一个字符串,代表 ss 和 tt 的最长公共子串。如果存在多个答案,输出在较短串中最先出现的那个。

示例1

输入:

awaabb
aawbb

输出:

aa

说明:

在这个样例中,"aa""aa" 和 "bb""bb" 都是 sstt 的最长公共子串,但 "aa""aa" 在较短串 ss 中首先出现,因此输出 "aa""aa"。

示例2

输入:

abcdefghijklmnop
abcsafjklmnopqrstuvw

输出:

jklmnop

思路:

  1. 降低循环,找出最短字符串

2. 求出最短字符串符合条件的子串(子串长度遍历+滑动窗口方式)

3. 找出同时满足长串的最长子串

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    const s = await readline();
    const t = await readline();
    const minL = Math.min(s.length, t.length);
    const minStr = s.length === minL ? s : t;
    const maxStr = s.length === minL ? t : s;
    //console.log(minL,'minL');
    let longStr = "";
    let longStrLen = 0;
    //const res = [];
    for(let i=2;i<minL;i++){
        for(let j=0;j<minL-1;j++){
            const subStr = minStr.slice(j,j+i);
            //res.push(minStr.slice(j,j+i));
            if(maxStr.includes(subStr)){
                if(subStr.length > longStrLen){
                    longStr = subStr;
                    longStrLen = subStr.length;
                }
                //res.push(subStr);
            }
        }
    }
    console.log(longStr); 
}()

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor