数组中的字符串匹配

标签: 数组 字符串 字符串匹配

难度: Easy

给你一个字符串数组 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] 都是独一无二的。

Submission

运行时间: 27 ms

内存: 15.9 MB

class Solution:
    def stringMatching(self, words: List[str]) -> List[str]:
        anw = []
        for i ,v in enumerate(words):
            for j,s in enumerate(words):
                if i != j and v in s:
                    anw.append(v)
                    break
        return anw

Explain

此题解采用了双重循环的方法来检查数组中的每个单词是否为其他单词的子字符串。外层循环遍历数组中的每个单词,内层循环则用来检查当前选中的单词是否为数组中其他单词的子字符串。如果是,则将其添加到结果列表中,并立即跳出内层循环,以避免重复添加相同的子字符串。

时间复杂度: O(n^2 * m)

空间复杂度: O(n)

class Solution:
    def stringMatching(self, words: List[str]) -> List[str]:
        anw = []
        for i, v in enumerate(words):  # 外层循环遍历单词
            for j, s in enumerate(words):  # 内层循环检查是否为子字符串
                if i != j and v in s:  # 如果是子字符串且不是同一个单词
                    anw.append(v)  # 添加到结果列表
                    break  # 跳出内层循环,避免重复添加
        return anw

Explore

在检查子字符串时确保`i != j`是为了避免将单词与其自身进行比较。如果没有这个条件,每个单词都会被错误地认为是自己的子字符串,因为任何字符串都是其自身的子字符串。这个条件确保了只有当一个单词是另一个不同单词的子字符串时,它才会被考虑添加到结果列表中。

使用`in`关键字来检查子字符串是一种简单且直观的方法,其时间复杂度大致为O(n*m),其中n和m分别是两个字符串的长度。尽管这种方法在简单场景下足够高效,但在涉及大规模数据或需要高性能匹配的情况下,可以考虑更高效的字符串匹配算法,如KMP算法、Boyer-Moore算法或Rabin-Karp算法。这些算法通过更复杂的预处理和搜索策略,能够在特定条件下提供更好的性能。

在这个解决方案中,避免重复添加子字符串的必要性在于确保每个作为其他单词子字符串的单词只被添加一次到结果列表中。实现方式是通过在内层循环中一旦发现当前单词是其他单词的子字符串,立即使用`break`语句跳出循环。这样可以防止因为一个单词可能是多个单词的子字符串而被重复添加多次。

在这种极端情况下,当前算法的性能会受到较大影响,因为每个单词都需要与数组中的每个其他单词进行比较。一种可能的优化是首先按字符串长度对数组进行排序。这样,只需要检查长度较短的字符串是否为长度较长字符串的子字符串,可以减少一些不必要的比较。另外,也可以考虑使用高效的字符串匹配算法如KMP来替代简单的`in`操作,以提高匹配的效率。