[LeetCode] 每日一题 2942. 查找包含给定字符的单词(简单题)
题目描述
给你一个下标从 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]
只包含小写英文字母。
解题思路
今天这题属于那种“一看就会”的简单题了,不需要太多算法技巧,主要就是考察对字符串基本操作的熟练度。
题目要求返回所有包含指定字符 x
的单词下标。我们只需要遍历一遍字符串数组,然后检查每个单词是否包含这个字符即可。Java 的 String.indexOf(char)
是非常合适的选择,它内部做了优化,效率也非常高。
有意思的是,我一开始尝试自己手动遍历每个字符串去找字符 x
,结果发现提交后运行时间是 2ms。但换成调用 Java 自带的 indexOf
之后,运行时间反而下降到了 1ms。这说明在底层的字符串查找实现上,Java 标准库其实已经做了不少性能优化。这个细节对我们后面写性能敏感的代码也挺有启发 💡
代码实现
class Solution {
public List<Integer> findWordsContaining(String[] words, char x) {
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < words.length; i++) {
if (words[i].indexOf(x) >= 0) {
ans.add(i);
}
}
return ans;
}
}
复杂度分析
⏱️ 时间复杂度:
O(n * m),其中 n 是单词数,m 是平均每个单词的长度(查找字符需要遍历字符串)
🧠 空间复杂度:
O(1),不计输出结果的空间消耗
总结
这道题本身非常简单,但它也提醒我们:熟练掌握标准库函数的用法,不仅能让代码更简洁,还能获得更好的性能。尤其在 Java 这种底层实现已经高度优化的语言里,有时候“手写轮子”不如直接用标准工具来的更快更稳 💪
希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。