LeetCode 2255:统计是给定字符串前缀的字符串数目
题目描述
LeetCode 2255. 统计是给定字符串前缀的字符串数目 是一道简单题。题目要求我们在一个字符串数组 words
中,统计有多少个字符串是给定字符串 s
的前缀。
题目详情
- 输入:
words
: 一个字符串数组,包含小写英文字母。s
: 一个字符串,同样只包含小写英文字母。
- 输出:
- 返回
words
中是s
前缀的字符串数目。
- 返回
- 前缀定义:
- 一个字符串的前缀是出现在字符串开头的子字符串。
- 注意:
- 相同的字符串可能在
words
中出现多次,每出现一次都需要计数。
- 相同的字符串可能在
示例
-
示例 1:
- 输入:
words = ["a","b","c","ab","bc","abc"], s = "abc"
- 输出:
3
- 解释:
"a"、"ab"、"abc"
是"abc"
的前缀,计数为 3。
- 输入:
-
示例 2:
- 输入:
words = ["a","a"], s = "aa"
- 输出:
2
- 解释:两个
"a"
都是"aa"
的前缀,计数为 2。
- 输入:
约束条件
1 <= words.length <= 1000
1 <= words[i].length, s.length <= 10
words[i]
和s
只包含小写英文字母。
解题思路
这道题的核心是判断一个字符串是否是另一个字符串的前缀。我们可以通过以下步骤解决问题:
-
理解前缀:
- 如果
words[i]
是s
的前缀,那么words[i]
必须完全等于s
从开头开始、长度为len(words[i])
的子字符串。 - 例如,
s = "abc"
,words[i] = "ab"
,则s[0:2] = "ab"
,符合前缀定义。
- 如果
-
实现逻辑:
- 遍历
words
中的每个字符串words[i]
。 - 用字符串切片
s[0:len(words[i])]
获取s
的前缀,长度与words[i]
相同。 - 比较
words[i]
和s[0:len(words[i])]
是否相等。 - 如果相等,计数加 1。
- 遍历
-
优化考虑:
- 由于题目约束中字符串长度较短(最多 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
:用于记录符合条件的字符串数量。n
:words
数组的长度,便于遍历。s[0:len(words[i])]
:从s
的开头取长度为len(words[i])
的子字符串。if words[i] == s[0:len(words[i])]
:检查words[i]
是否与s
的对应前缀相等。- 返回:遍历结束后返回计数结果。
时间与空间复杂度
-
时间复杂度:
- 遍历
words
数组需要O(n)
,其中n = len(words)
。 - 对于每个
words[i]
,字符串切片和比较的时间复杂度为O(k)
,其中k = len(words[i])
。 - 总时间复杂度为
O(n * k)
。 - 由于题目约束
k <= 10
,实际复杂度接近O(n)
。
- 遍历
-
空间复杂度:
- 只使用了常数级别的额外空间(
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 题目有更多疑问,欢迎留言讨论!