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

标签: 数组 字符串

难度: Easy

给你一个字符串数组 words 和一个字符串 s ,其中 words[i] 和 s 只包含 小写英文字母 。

请你返回 words 中是字符串 s 前缀 字符串数目 。

一个字符串的 前缀 是出现在字符串开头的子字符串。子字符串 是一个字符串中的连续一段字符序列。

示例 1:

输入:words = ["a","b","c","ab","bc","abc"], s = "abc"
输出:3
解释:
words 中是 s = "abc" 前缀的字符串为:
"a" ,"ab" 和 "abc" 。
所以 words 中是字符串 s 前缀的字符串数目为 3 。

示例 2:

输入:words = ["a","a"], s = "aa"
输出:2
解释:
两个字符串都是 s 的前缀。
注意,相同的字符串可能在 words 中出现多次,它们应该被计数多次。

提示:

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

Submission

运行时间: 26 ms

内存: 16.2 MB

from typing import List


class Solution:
    def countPrefixes(self, words: List[str], s: str) -> int:
        count = 0
        for i in range(len(s)):
            w = s[0:i + 1]
            for word in words:
                if w ==word:
                    count += 1
        return count


if __name__ == '__main__':
    solution = Solution()
    words = ["a", "b", "c", "ab", "bc", "abc"]
    s = "abc"
    print(solution.countPrefixes(words,s))

Explain

该题解通过生成字符串s的所有前缀,并对每个前缀检查它是否出现在words数组中来计算符合条件的字符串数目。具体来说,首先遍历字符串s的每个可能的前缀,然后对于每个前缀,在words数组中检查是否存在这样的字符串。如果存在,则计数器增加。

时间复杂度: O(M*N)

空间复杂度: O(1)

from typing import List


class Solution:
    def countPrefixes(self, words: List[str], s: str) -> int:
        count = 0  # 初始化计数器
        for i in range(len(s)):
            w = s[0:i + 1]  # 生成s的前缀
            for word in words:
                if w == word:  # 检查当前前缀是否在words中
                    count += 1  # 如果是,则计数器增加
        return count


if __name__ == '__main__':
    solution = Solution()
    words = ["a", "b", "c", "ab", "bc", "abc"]
    s = "abc"
    print(solution.countPrefixes(words, s))

Explore

使用嵌套循环是一种直接的实现方式,容易理解和编写,但确实不是最高效的方法。使用哈希表可以将查询时间从线性时间复杂度降低到常数时间复杂度,大大提高算法的效率,特别是在words数组较大时。在实际应用中,优化算法以使用哈希表来存储words数组中的字符串,可以使得每次查找操作的时间复杂度降低,从而提高整体性能。

该算法的性能确实会随着字符串s的长度和words数组的大小而显著下降。因为算法的时间复杂度为O(n*m),其中n是字符串s的长度,m是words数组的长度。每增加一个字符到字符串s,就需要额外进行m次比较。如果words数组很大,每次比较都是高成本的。因此,在处理非常长的字符串或大量的words项时,性能会受到显著影响。

在当前实现中,算法会将words数组中的每个元素作为独立的项处理,即使它们是重复的。这意味着如果words数组中包含重复的字符串,每当这个字符串匹配前缀时,计数器都会增加,导致重复计数。例如,如果words包含多次"abc",且"abc"是s的前缀,每次"abc"出现都会被计算。这可能不是预期的行为,通常我们应该只计算独立出现的前缀字符串。

根据当前的算法实现,如果字符串s是空字符串,则不会生成任何前缀,因此循环体内的代码不会执行,结果count将保持为0并返回。同样,如果words数组为空,则内层循环不会执行任何迭代,因此count同样保持为0。算法本身在这两种情况下自然地处理了这些边界情况,不会出现错误或异常。不过,算法没有显式地检查这些边界情况,而是依赖于循环结构来隐式处理。