搜索
首页后端开发php教程字符串前缀分数之和

字符串前缀分数之和

Sep 26, 2024 am 06:13 AM

Sum of Prefix Scores of Strings

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] 由小写英文字母组成。

提示:

  1. 什么样的数据结构可以让您有效地跟踪每个前缀的分数?
  2. 使用特里树。将所有单词插入其中,并在每个节点处保留一个计数器,该计数器会告诉您我们访问每个前缀的次数。

解决方案:

我们可以使用 Trie 数据结构,它对于处理前缀特别有效。 Trie 中的每个节点都代表单词的一个字母,我们将在每个节点维护一个计数器来存储遇到该前缀的次数。这使我们能够通过计算有多少个单词以该前缀开头来有效地计算每个前缀的分数。

方法:

  1. 将单词插入 Trie:

    • 我们将逐个字符地将每个单词插入到 Trie 中。
    • 在每个节点(代表一个字符),我们维护一个计数器来跟踪有多少单词通过该前缀。
  2. 计算前缀分数:

    • 对于每个单词,当我们遍历 Trie 中的前缀时,我们将对每个节点存储的计数器求和,以计算每个前缀的分数。
  3. 构建答案数组:

    • 对于每个单词,我们将计算其所有前缀的分数总和并将其存储在结果数组中。

让我们用 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]
?>

解释:

  1. TrieNode 类:

    • 每个节点都有一个子节点数组(代表单词中的下一个字符)和一个计数,用于跟踪有多少单词共享此前缀。
  2. 特里类:

    • insert 方法向 Trie 中添加一个单词。当我们插入每个字符时,我们会增加每个节点的计数,表示有多少个单词具有此前缀。
    • getPrefixScores 方法计算给定单词的所有前缀的分数总和。它遍历 Trie,将单词中某个字符对应的每个节点的计数相加。
  3. 主要函数(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:

  • LinkedIn
  • GitHub

以上是字符串前缀分数之和的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您应该多久再生一次会话ID?您应该多久再生一次会话ID?Apr 23, 2025 am 12:03 AM

会话ID应在登录时、敏感操作前和每30分钟定期重新生成。1.登录时重新生成会话ID可防会话固定攻击。2.敏感操作前重新生成提高安全性。3.定期重新生成降低长期利用风险,但需权衡用户体验。

如何在PHP中设置会话cookie参数?如何在PHP中设置会话cookie参数?Apr 22, 2025 pm 05:33 PM

在PHP中设置会话cookie参数可以通过session_set_cookie_params()函数实现。1)使用该函数设置参数,如过期时间、路径、域名、安全标志等;2)调用session_start()使参数生效;3)根据需求动态调整参数,如用户登录状态;4)注意设置secure和httponly标志以提升安全性。

在PHP中使用会议的主要目的是什么?在PHP中使用会议的主要目的是什么?Apr 22, 2025 pm 05:25 PM

在PHP中使用会话的主要目的是维护用户在不同页面之间的状态。1)会话通过session_start()函数启动,创建唯一会话ID并存储在用户cookie中。2)会话数据保存在服务器上,允许在不同请求间传递数据,如登录状态和购物车内容。

您如何在子域中分享会议?您如何在子域中分享会议?Apr 22, 2025 pm 05:21 PM

如何在子域名间共享会话?通过设置通用域名的会话cookie实现。1.在服务器端设置会话cookie的域为.example.com。2.选择合适的会话存储方式,如内存、数据库或分布式缓存。3.通过cookie传递会话ID,服务器根据ID检索和更新会话数据。

使用HTTP如何影响会话安全性?使用HTTP如何影响会话安全性?Apr 22, 2025 pm 05:13 PM

HTTPS通过加密数据传输、防止中间人攻击和提供身份验证,显着提升了会话的安全性。 1)加密数据传输:HTTPS使用SSL/TLS协议加密数据,确保数据在传输过程中不被窃取或篡改。 2)防止中间人攻击:通过SSL/TLS握手过程,客户端验证服务器证书,确保连接合法性。 3)提供身份验证:HTTPS确保连接的是合法服务器,保护数据完整性和机密性。

继续使用PHP:耐力的原因继续使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、灵活性和强大的生态系统。1)易用性和简单语法使其成为初学者的首选。2)与web开发紧密结合,处理HTTP请求和数据库交互出色。3)庞大的生态系统提供了丰富的工具和库。4)活跃的社区和开源性质使其适应新需求和技术趋势。

PHP和Python:探索他们的相似性和差异PHP和Python:探索他们的相似性和差异Apr 19, 2025 am 12:21 AM

PHP和Python都是高层次的编程语言,广泛应用于Web开发、数据处理和自动化任务。1.PHP常用于构建动态网站和内容管理系统,而Python常用于构建Web框架和数据科学。2.PHP使用echo输出内容,Python使用print。3.两者都支持面向对象编程,但语法和关键字不同。4.PHP支持弱类型转换,Python则更严格。5.PHP性能优化包括使用OPcache和异步编程,Python则使用cProfile和异步编程。

PHP和Python:解释了不同的范例PHP和Python:解释了不同的范例Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具