举例:
var str = 'qwe15as45',str1 = 'ewzc15asd'
查找两个字符串 相同的片段 很直观'15as'是相同片段;
先说一下结题思路,有很多种,我只说我想的思路;
就是将str1按它长度(最大到长度为1)的所有片段 去和str 对比(取包含的) 然后找出最长的
所以重点就是如何找str1 的所有片段
//将str1 字符串按长度 组合排列
//由于例子的str1有点长 我就重新定义一个str1 = '1234'
//所以str1 长度为4的组合 1234 ,长度3:123,234两种 长度为2:12,23,34,三种 长度为1: 1,2,3,4四种
红线左边的是长度 右边是字符串的索引 为什么这么写 因为用到slice() 字符串截取
好首先把这个问题解决了 我们创建一个对象 数据格式是 key:字符串长度, 右边的用一个数组装起来
通过这个方法找到字符串 所有长度下的组合 也就是片段 我们现在只是获取了数组的索引 接下来就简单了 匹配就完事了
function getPublic(str,str1){
var arr = [];//用来装所有包含的字符串
len = str.length
while(len!=0){
for (var i = 0;i<str.length;i++){
if(i+len-1 <str.length){
var t=str.slice(i,i+len)
if(str1.includes(t)){
arr.push(t)
}
}
}
len --
}
return new Set(arr)//这里要去重
}
将 一开始我们举例的字符串带入
得到一个数组 如果希望的是最长的 那个
function getPublic(str,str1){
var arr = []
len = str.length
while(len!=0){
for (var i = 0;i<str.length;i++){
if(i+len-1 <str.length){
var t=str.slice(i,i+len)
if(str1.includes(t)){
arr.push(t)
}
}
}
len --
}
return [...new Set(arr)].reduce((p,c) => {return p.length>c.length ? p : c})
}
就拿到了最长的 公共片段 该方法一样可以解决两个数组 相同相邻的元素