文章

[LeetCode] 每日一题 2942. 查找包含给定字符的单词(简单题)

题目描述

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

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

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

题目链接

https://leetcode.cn/problems/find-words-containing-character

示例输入

示例 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 这种底层实现已经高度优化的语言里,有时候“手写轮子”不如直接用标准工具来的更快更稳 💪

希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。

License:  CC BY 4.0