描述
对于给定的两个字符串 s 和 t,你需要找出它们的最长公共子串。特别地,如果存在多个答案,输出在较短串中最先出现的那个。
子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
如果字符串 a 的一个子串 a′ 与字符串 b 的一个子串 b′ 完全相等,那么子串 a′,b′ 是字符串 a,b 的一个公共子串。
输入描述:
第一行输入一个长度为 1≦len(s)≦300、仅由小写字母组成的字符串 s。
第二行输入一个长度为 1≦len(t)≦300、仅由小写字母组成的字符串 t。
输出描述:
输出一个字符串,代表 s 和 t 的最长公共子串。如果存在多个答案,输出在较短串中最先出现的那个。
示例1
输入:
awaabb
aawbb
输出:
aa
说明:
在这个样例中,"aa" 和 "bb" 都是 s 和 t 的最长公共子串,但 "aa" 在较短串 s 中首先出现,因此输出 "aa"。
示例2
输入:
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出:
jklmnop
思路:
- 降低循环,找出最短字符串
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);
}()




