查找包含给定字符的单词

标签: 数组 字符串

难度: Easy

给你一个下标从 0 开始的字符串数组 words 和一个字符 x 。

请你返回一个 下标数组 ,表示下标在数组中对应的单词包含字符 x 。

注意 ,返回的数组可以是 任意 顺序。

示例 1:

输入:words = ["leet","code"], x = "e"
输出:[0,1]
解释:"e" 在两个单词中都出现了:"leet" 和 "code" 。所以我们返回下标 0 和 1 。

示例 2:

输入:words = ["abc","bcd","aaaa","cbc"], x = "a"
输出:[0,2]
解释:"a" 在 "abc" 和 "aaaa" 中出现了,所以我们返回下标 0 和 2 。

示例 3:

输入:words = ["abc","bcd","aaaa","cbc"], x = "z"
输出:[]
解释:"z" 没有在任何单词中出现。所以我们返回空数组。

提示:

  • 1 <= words.length <= 50
  • 1 <= words[i].length <= 50
  • x 是一个小写英文字母。
  • words[i] 只包含小写英文字母。

Submission

运行时间: 20 ms

内存: 16.6 MB

class Solution:
    def findWordsContaining(self, words: List[str], x: str) -> List[int]:
        return [i for i in range(len(words)) if x in words[i]]

Explain

题解通过使用列表推导来遍历字符串数组 `words`,对于每一个索引 `i` 和对应的单词,检查字符 `x` 是否存在于该单词中。如果存在,就将索引 `i` 添加到结果列表中。这种方法直接利用了 Python 的 `in` 关键字来进行成员检查,因此非常简洁且易于理解。

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

空间复杂度: O(n)

class Solution:
    def findWordsContaining(self, words: List[str], x: str) -> List[int]:
        # 使用列表推导式遍历所有单词,并检查每个单词是否包含字符 x
        return [i for i in range(len(words)) if x in words[i]]

Explore

当处理非常大的数据时,使用列表推导可能会消耗大量内存,因为它会一次性生成一个完整的列表。为了提高内存效率,可以使用生成器表达式代替列表推导。生成器表达式不会一次性生成所有结果,而是按需生成每个结果,从而节省内存。在函数中,可以返回一个生成器对象而非列表,或者逐个处理并输出结果。例如: python class Solution: def findWordsContaining(self, words: List[str], x: str) -> Iterator[int]: return (i for i in range(len(words)) if x in words[i]) 这样调用者可以通过迭代返回的生成器来逐个获取结果,而不是一次性加载到内存中。

在当前的实现中,如果字符 `x` 不在任何单词中,列表推导式将不会找到任何匹配项,因此返回一个空列表。这本身就是一个合理的行为,因为它正确地表示没有单词包含给定的字符。通常,返回空列表是处理此类情况的有效方法,因为它既明确又能够通过返回值的长度给调用者正确的信号。因此,不需要额外的逻辑来特别处理这种情况。

如果需要处理特殊字符或考虑大小写敏感的情况,可以在检查 `x` 是否在单词中之前添加相应的处理逻辑。例如,如果需要忽视大小写,可以在比较之前将单词和字符 `x` 都转换为同样的大小写形式(全部大写或全部小写)。对于特殊字符,根据具体需求可能需要进行适当的转义或编码。示例代码如下: python class Solution: def findWordsContaining(self, words: List[str], x: str) -> List[int]: x = x.lower() # 将搜索字符转换为小写 return [i for i in range(len(words)) if x in words[i].lower()] # 同时将单词转换为小写进行比较 这种方法使函数更加灵活且适应多种情况。