字符串前缀分数之和
2416。字符串前缀分数之和
难度:难
主题:数组、字符串、Trie、计数
给你一个大小为 n 的单词数组,由 非空 字符串组成。
我们将字符串单词的分数定义为字符串单词[i]的数量,这样单词就是单词[i]的前缀。
- 例如,如果words = ["a", "ab", "abc", "cab"],那么"ab"的分数是2,因为"ab"是"ab"和"ab"的前缀“abc”。
返回大小为n的数组答案,其中answer[i]是单词[i]的每个非空前缀分数的总和。
注意字符串被视为其自身的前缀。
示例1:
- 输入:words = ["abc","ab","bc","b"]
- 输出: [5,4,3,2]
-
解释: 每个字符串的答案如下:
- “abc”有 3 个前缀:“a”、“ab”和“abc”。
- 有 2 个带有前缀“a”的字符串,2 个带有前缀“ab”的字符串,1 个带有前缀“abc”的字符串。
- 总数为答案[0] = 2 + 2 + 1 = 5。
- “ab”有 2 个前缀:“a”和“ab”。
- 有 2 个带有前缀“a”的字符串,以及 2 个带有前缀“ab”的字符串。
- 总数为答案[1] = 2 + 2 = 4。
- “bc”有 2 个前缀:“b”和“bc”。
- 有 2 个带有前缀“b”的字符串,1 个带有前缀“bc”的字符串。
- 总数为答案[2] = 2 + 1 = 3。
- “b”有 1 个前缀:“b”。
- 有 2 个字符串带有前缀“b”。
- 总数为答案[3] = 2。
示例2:
- 输入:words = ["abcd"]
- 输出: [4]
-
说明:
- “abcd”有 4 个前缀:“a”、“ab”、“abc”和“abcd”。
- 每个前缀的得分为 1,因此总数为 answer[0] = 1 + 1 + 1 + 1 = 4。
约束:
- 1
- 1
- words[i] 由小写英文字母组成。
提示:
- 什么样的数据结构可以让您有效地跟踪每个前缀的分数?
- 使用特里树。将所有单词插入其中,并在每个节点处保留一个计数器,该计数器会告诉您我们访问每个前缀的次数。
解决方案:
我们可以使用 Trie 数据结构,它对于处理前缀特别有效。 Trie 中的每个节点都代表单词的一个字母,我们将在每个节点维护一个计数器来存储遇到该前缀的次数。这使我们能够通过计算有多少个单词以该前缀开头来有效地计算每个前缀的分数。
方法:
-
将单词插入 Trie:
- 我们将逐个字符地将每个单词插入到 Trie 中。
- 在每个节点(代表一个字符),我们维护一个计数器来跟踪有多少单词通过该前缀。
-
计算前缀分数:
- 对于每个单词,当我们遍历 Trie 中的前缀时,我们将对每个节点存储的计数器求和,以计算每个前缀的分数。
-
构建答案数组:
- 对于每个单词,我们将计算其所有前缀的分数总和并将其存储在结果数组中。
让我们用 PHP 实现这个解决方案:2416。字符串前缀分数之和
<?php class TrieNode { /** * @var array */ public $children; /** * @var int */ public $count; public function __construct() { $this->children = []; $this->count = 0; } } class Trie { /** * @var TrieNode */ private $root; public function __construct() { $this->root = new TrieNode(); } /** * Insert a word into the Trie and update the prefix counts * * @param $word * @return void */ public function insert($word) { ... ... ... /** * go to ./solution.php */ } /** * Get the sum of prefix scores for a given word * * @param $word * @return int */ public function getPrefixScores($word) { ... ... ... /** * go to ./solution.php */ } } /** * @param String[] $words * @return Integer[] */ function sumOfPrefixScores($words) { ... ... ... /** * go to ./solution.php */ } // Example usage: $words1 = ["abc", "ab", "bc", "b"]; $words2 = ["abcd"]; print_r(sumOfPrefixScores($words1)); // Output: [5, 4, 3, 2] print_r(sumOfPrefixScores($words2)); // Output: [4] ?>
解释:
-
TrieNode 类:
- 每个节点都有一个子节点数组(代表单词中的下一个字符)和一个计数,用于跟踪有多少单词共享此前缀。
-
特里类:
- insert 方法向 Trie 中添加一个单词。当我们插入每个字符时,我们会增加每个节点的计数,表示有多少个单词具有此前缀。
- getPrefixScores 方法计算给定单词的所有前缀的分数总和。它遍历 Trie,将单词中某个字符对应的每个节点的计数相加。
-
主要函数(sumOfPrefixScores):
- First, we insert all words into the Trie.
- Then, for each word, we calculate the sum of scores for its prefixes by querying the Trie and store the result in the result array.
Example:
For words = ["abc", "ab", "bc", "b"], the output will be:
Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 )
- "abc" has 3 prefixes: "a" (2 words), "ab" (2 words), "abc" (1 word) -> total = 5.
- "ab" has 2 prefixes: "a" (2 words), "ab" (2 words) -> total = 4.
- "bc" has 2 prefixes: "b" (2 words), "bc" (1 word) -> total = 3.
- "b" has 1 prefix: "b" (2 words) -> total = 2.
Time Complexity:
- Trie Construction: O(n * m) where n is the number of words and m is the average length of the words.
- Prefix Score Calculation: O(n * m) as we traverse each word's prefix in the Trie.
This approach ensures that we efficiently compute the prefix scores in linear time relative to the total number of characters in all words.
Contact Links
If you found this series helpful, please consider giving the repository a star on GitHub or sharing the post on your favorite social networks ?. Your support would mean a lot to me!
If you want more helpful content like this, feel free to follow me:
- GitHub
以上是字符串前缀分数之和的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
