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] 只包含小写英文字母

解题思路

这道题是一个简单的字符串查找问题,需要在字符串数组中找到包含指定字符的单词下标。

解题思路:

最直观的方法是遍历每个单词,检查是否包含目标字符。具体步骤如下:

  1. 创建一个结果数组用于存储符合条件的单词下标
  2. 遍历 words 数组,对于每个单词(下标为 i):
    • 检查该单词是否包含字符 x
    • 如果包含,将下标 i 添加到结果数组中
  3. 返回结果数组

实现方法:

  • 方法一:使用内置函数:利用各语言的字符串查找函数(如 findinincludes 等)
  • 方法二:手动遍历:对每个单词的每个字符进行遍历比较

由于题目数据规模较小(单词数量不超过50,单词长度不超过50),两种方法的性能差异微乎其微。推荐使用方法一,代码更简洁易读。

代码实现

class Solution {
public:
    vector<int> findWordsContaining(vector<string>& words, char x) {
        vector<int> result;
        for (int i = 0; i < words.size(); i++) {
            if (words[i].find(x) != string::npos) {
                result.push_back(i);
            }
        }
        return result;
    }
};
class Solution:
    def findWordsContaining(self, words: List[str], x: str) -> List[int]:
        result = []
        for i, word in enumerate(words):
            if x in word:
                result.append(i)
        return result
public class Solution {
    public IList<int> FindWordsContaining(string[] words, char x) {
        List<int> result = new List<int>();
        for (int i = 0; i < words.Length; i++) {
            if (words[i].Contains(x)) {
                result.Add(i);
            }
        }
        return result;
    }
}
var findWordsContaining = function(words, x) {
    const result = [];
    for (let i = 0; i < words.length; i++) {
        if (words[i].includes(x)) {
            result.push(i);
        }
    }
    return result;
};

复杂度分析

复杂度类型分析
时间复杂度O(n × m),其中 n 是单词数量,m 是单词的平均长度
空间复杂度O(k),其中 k 是包含目标字符的单词数量

相关题目