统计包含给定前缀的字符串

标签: 数组 字符串 字符串匹配

难度: Easy

给你一个字符串数组 words 和一个字符串 pref

返回 words 中以 pref 作为 前缀 的字符串的数目。

字符串 s前缀 就是  s 的任一前导连续字符串。

示例 1:

输入:words = ["pay","attention","practice","attend"], pref = "at"
输出:2
解释:以 "at" 作为前缀的字符串有两个,分别是:"attention" 和 "attend" 。

示例 2:

输入:words = ["leetcode","win","loops","success"], pref = "code"
输出:0
解释:不存在以 "code" 作为前缀的字符串。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length, pref.length <= 100
  • words[i]pref 由小写英文字母组成

Submission

运行时间: 20 ms

内存: 16.7 MB

class Solution:
    def prefixCount(self, words: List[str], pref: str) -> int:
        return sum([w.startswith(pref) for w in words])

Explain

此题解采用了直接的方法来解决问题,即检查数组 `words` 中每个字符串是否以给定的前缀 `pref` 开始。这里使用了 Python 列表推导式和 `startswith` 方法来实现这一点。`startswith` 方法检查字符串是否以特定前缀开始,并返回布尔值。列表推导式会为 `words` 中的每个元素生成一个布尔值列表,然后 `sum` 函数计算列表中 `True` 的总数(即以 `pref` 开始的字符串数量)。

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

空间复杂度: O(n)

class Solution:
    def prefixCount(self, words: List[str], pref: str) -> int:
        # 使用列表推导式生成每个单词是否以 pref 开头的布尔值列表
        # w.startswith(pref) 检查字符串 w 是否以 pref 作为前缀
        # sum 函数计算列表中 True 的数量,即以 pref 开头的单词总数
        return sum([w.startswith(pref) for w in words])

Explore

`startswith`方法是一个内置的Python字符串函数,它提供了一种直观、简洁且效率较高的方式来检查一个字符串是否以特定的前缀开始。使用这个方法可以清晰地表达意图,且由于是内置方法,通常比自行实现的方法性能更优。除了`startswith`,我们也可以使用字符串切片来检查前缀,例如通过比较`w[:len(pref)] == pref`来实现。这种方法虽然也能工作,但在可读性和表达性上不如`startswith`方法直观。

列表推导式在处理较小至中等规模的数据时通常很高效且易于编写,但在处理大规模数据时可能会导致较高的内存消耗,因为它会创建一个临时列表来存储中间结果。对于非常大的数据集,使用生成器表达式(使用圆括号而非方括号)可以更节省内存,因为生成器表达式会产生一个迭代器,按需计算每个元素,而不是一次性生成整个列表。例如,可以改写为:`sum(w.startswith(pref) for w in words)`。此外,对于极大的数据集或需要高度优化的场景,可能需要采用多线程或多进程来并行处理数据,或者使用更高效的数据结构如前缀树(Trie)。

是的,`startswith`方法在设计时已经考虑到了前缀`pref`可能大于字符串`w`的长度的情况。在这种情况下,`startswith`方法会返回`False`,因为一个较短的字符串不可能以一个较长的字符串作为前缀。这保证了算法的鲁棒性,即使在面对长度不一或异常数据时也能正确处理。