LeetCode:1408.数组中的字符串匹配(难度:🌟🌟)

76 阅读1分钟

一、前言🌟

哈喽,小伙伴们,我是泽南👨‍🎓。不管你是准备跳槽还是在职苟着,都一起行动起来,顺应这个内卷时代干点该干的事儿👣。所以,赶紧跟着我的步伐卷起来吧⏰,变强从这一刻开始!➕🧈

二、题目介绍🌟

给你一个字符串数组 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 <= 100
  • 1 <= words[i].length <= 30
  • words[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,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。