LeetCode 2255:统计是给定字符串前缀的字符串数目

LeetCode 2255:统计是给定字符串前缀的字符串数目

题目描述

LeetCode 2255. 统计是给定字符串前缀的字符串数目 是一道简单题。题目要求我们在一个字符串数组 words 中,统计有多少个字符串是给定字符串 s 的前缀。

题目详情

  • 输入
    • words: 一个字符串数组,包含小写英文字母。
    • s: 一个字符串,同样只包含小写英文字母。
  • 输出
    • 返回 words 中是 s 前缀的字符串数目。
  • 前缀定义
    • 一个字符串的前缀是出现在字符串开头的子字符串。
  • 注意
    • 相同的字符串可能在 words 中出现多次,每出现一次都需要计数。

示例

  1. 示例 1

    • 输入:words = ["a","b","c","ab","bc","abc"], s = "abc"
    • 输出:3
    • 解释:"a"、"ab"、"abc""abc" 的前缀,计数为 3。
  2. 示例 2

    • 输入:words = ["a","a"], s = "aa"
    • 输出:2
    • 解释:两个 "a" 都是 "aa" 的前缀,计数为 2。

约束条件

  • 1 <= words.length <= 1000
  • 1 <= words[i].length, s.length <= 10
  • words[i]s 只包含小写英文字母。

解题思路

这道题的核心是判断一个字符串是否是另一个字符串的前缀。我们可以通过以下步骤解决问题:

  1. 理解前缀

    • 如果 words[i]s 的前缀,那么 words[i] 必须完全等于 s 从开头开始、长度为 len(words[i]) 的子字符串。
    • 例如,s = "abc"words[i] = "ab",则 s[0:2] = "ab",符合前缀定义。
  2. 实现逻辑

    • 遍历 words 中的每个字符串 words[i]
    • 用字符串切片 s[0:len(words[i])] 获取 s 的前缀,长度与 words[i] 相同。
    • 比较 words[i]s[0:len(words[i])] 是否相等。
    • 如果相等,计数加 1。
  3. 优化考虑

    • 由于题目约束中字符串长度较短(最多 10),直接使用字符串切片和比较的性能是足够的。
    • 不需要额外的复杂数据结构(如字典或前缀树)。

代码实现

以下是 Python 的实现代码:

class Solution:
    def countPrefixes(self, words: List[str], s: str) -> int:
        res = 0  # 初始化计数器
        n = len(words)  # 获取 words 数组长度
        for i in range(n):
            # 判断 words[i] 是否等于 s 的前缀(长度与 words[i] 相同)
            if words[i] == s[0:len(words[i])]:
                res += 1  # 如果是前缀,计数加 1
        return res  # 返回结果

代码解析

  • res:用于记录符合条件的字符串数量。
  • nwords 数组的长度,便于遍历。
  • s[0:len(words[i])]:从 s 的开头取长度为 len(words[i]) 的子字符串。
  • if words[i] == s[0:len(words[i])]:检查 words[i] 是否与 s 的对应前缀相等。
  • 返回:遍历结束后返回计数结果。

时间与空间复杂度

  1. 时间复杂度

    • 遍历 words 数组需要 O(n),其中 n = len(words)
    • 对于每个 words[i],字符串切片和比较的时间复杂度为 O(k),其中 k = len(words[i])
    • 总时间复杂度为 O(n * k)
    • 由于题目约束 k <= 10,实际复杂度接近 O(n)
  2. 空间复杂度

    • 只使用了常数级别的额外空间(res 和循环变量),因此空间复杂度为 O(1)

测试用例验证

用例 1

  • 输入:words = ["a","b","c","ab","bc","abc"], s = "abc"
  • 过程:
    • "a" == "abc"[0:1]"a" == "a",计数 +1。
    • "b" == "abc"[0:1]"b" != "a",无变化。
    • "c" == "abc"[0:1]"c" != "a",无变化。
    • "ab" == "abc"[0:2]"ab" == "ab",计数 +1。
    • "bc" == "abc"[0:2]"bc" != "ab",无变化。
    • "abc" == "abc"[0:3]"abc" == "abc",计数 +1。
  • 输出:3

用例 2

  • 输入:words = ["a","a"], s = "aa"
  • 过程:
    • "a" == "aa"[0:1]"a" == "a",计数 +1。
    • "a" == "aa"[0:1]"a" == "a",计数 +1。
  • 输出:2

小结

这道题是一道基础的字符串处理题目,主要考察对前缀的理解和基本的字符串操作。代码实现简单高效,直接通过遍历和切片比较即可解决问题。如果你对字符串处理或 LeetCode 题目有更多疑问,欢迎留言讨论!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值