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 <= 501 <= words[i].length <= 50x是小写英文字母words[i]只包含小写英文字母
解题思路
这道题是一个简单的字符串查找问题,需要在字符串数组中找到包含指定字符的单词下标。
解题思路:
最直观的方法是遍历每个单词,检查是否包含目标字符。具体步骤如下:
- 创建一个结果数组用于存储符合条件的单词下标
- 遍历 words 数组,对于每个单词(下标为 i):
- 检查该单词是否包含字符 x
- 如果包含,将下标 i 添加到结果数组中
- 返回结果数组
实现方法:
- 方法一:使用内置函数:利用各语言的字符串查找函数(如
find、in、includes等) - 方法二:手动遍历:对每个单词的每个字符进行遍历比较
由于题目数据规模较小(单词数量不超过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 是包含目标字符的单词数量 |