一、前言🌟
哈喽,小伙伴们,我是泽南👨🎓。不管你是准备跳槽还是在职苟着,都一起行动起来,顺应这个内卷时代干点该干的事儿👣。所以,赶紧跟着我的步伐卷起来吧⏰,变强从这一刻开始!➕🧈
二、题目介绍🌟
给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 words[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。
示例 1:
输入: words = ["mass","as","hero","superhero"]
输出: ["as","hero"]
解释: "as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。["hero","as"] 也是有效的答案。
示例 2:
输入: words = ["leetcode","et","code"]
输出: ["et","code"]
解释: "et" 和 "code" 都是 "leetcode" 的子字符串。
示例 3:
输入: words = ["blue","green","bu"]
输出: []
提示:
1 <= words.length <= 1001 <= words[i].length <= 30words[i]仅包含小写英文字母。- 题目数据 保证 每个
words[i]都是独一无二的。
解法一 :中心扩散法
解题思路:
1、通过 Join() 将数组链接成一个字符串 strs ;
2、如果 word[i] 是 另一个 word[j] 的子字符串,那么word[i]在 strs 出现的次数必定大于等于2,即 strs.indexOf(words[i])!=strs.lastIndexOf(words[i]);
3、循环遍历数组
var stringMatching = function(words) {
let strs = words.join(",");
let res = []
for(let i=0; i< words.length; i++){
let first = strs.indexOf(words[i]);
let last = strs.lastIndexOf(words[i]);
if(first!=-1 &&last !=-1 && first!=last ){
res.push(words[i]);
}
}
return res;
};
简洁算法
function stringMatching(words: string[]): string[] {
const s = words.join("#")
return words.filter((word) => s.indexOf(word) !== s.lastIndexOf(word))
};
最后🌟:
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,
🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。