Leetcode.2416 字符串的前缀分数和
创始人
2024-05-30 19:18:22
0

题目链接

Leetcode.2416 字符串的前缀分数和 Rating : 1725

题目描述

给你一个长度为 n的数组 words,该数组由 非空 字符串组成。

定义字符串 word的 分数 等于以 word作为 前缀 的 words[i]的数目。

  • 例如,如果 words = ["a", "ab", "abc", "cab"],那么 "ab"的分数是 2,因为 "ab""ab""abc"的一个前缀。

返回一个长度为 n的数组 answer,其中 answer[i]words[i]的每个非空前缀的分数 总和

注意:字符串视作它自身的一个前缀。

示例 1:

输入:words = [“abc”,“ab”,“bc”,“b”]
输出:[5,4,3,2]
解释:对应每个字符串的答案如下:
“abc” 有 3 个前缀:“a”、“ab” 和 “abc” 。
2 个字符串的前缀为 “a” ,2 个字符串的前缀为 “ab” ,1 个字符串的前缀为 “abc” 。
总计 answer[0] = 2 + 2 + 1 = 5 。
“ab” 有 2 个前缀:“a” 和 “ab” 。
2 个字符串的前缀为 “a” ,2 个字符串的前缀为 “ab” 。
总计 answer[1] = 2 + 2 = 4 。
“bc” 有 2 个前缀:“b” 和 “bc” 。
2 个字符串的前缀为 “b” ,1 个字符串的前缀为 “bc” 。
总计 answer[2] = 2 + 1 = 3 。
“b” 有 1 个前缀:“b”。
2 个字符串的前缀为 “b” 。
总计 answer[3] = 2 。

示例 2:

输入:words = [“abcd”]
输出:[4]
解释:
“abcd” 有 4 个前缀 “a”、“ab”、“abc” 和 “abcd”。
每个前缀的分数都是 1 ,总计 answer[0] = 1 + 1 + 1 + 1 = 4 。

提示:

  • 1<=words.length<=10001 <= words.length <= 10001<=words.length<=1000
  • 1<=words[i].length<=10001 <= words[i].length <= 10001<=words[i].length<=1000
  • words[i]由小写英文字母组成

分析:字典树

对于样例1的 words = ["abc","ab","bc","b"],我们可以把它们全部插入到一棵 字典树 中。如下图:

在这里插入图片描述

我们发现 abc的 前缀分数和就等于 abc这条路径上所有字符的出现次数,其他的也同理。

  • abc的前缀分数和为 2 + 2 + 1 = 5
  • ab的前缀分数和为 2 + 2 = 4
  • bc的前缀分数和为 2 + 1 = 3
  • b的前缀分数和为 2

时间复杂度: O(L)O(L)O(L)

C++代码:

class Solution {
public:vector sumPrefixScores(vector& words) {struct Node{Node* children[26] = {};int cnt = 0;};Node* root = new Node();for(auto &s:words){auto node = root;for(auto c:s){int idx = c  -'a';if(node->children[idx] == nullptr) node->children[idx] = new Node();node = node->children[idx];node->cnt++;}}int n = words.size();vector ans(n);for(int i = 0;i < n;i++){auto node = root;for(auto c:words[i]){int idx = c  -'a';if(node->children[idx] != nullptr){node = node->children[idx];ans[i] += node->cnt;}else break;}}return ans;}
};

Java代码:

class Solution {Trie root = new Trie();private void insert(String s){Trie node = root;for(var c:s.toCharArray()){int idx = c - 'a';if(node.childern[idx] == null) node.childern[idx] = new Trie();node = node.childern[idx];node.cnt++;}}private int get(String s){Trie node = root;int ans = 0;for(var c:s.toCharArray()){int idx = c  -'a';if(node.childern[idx] != null){node = node.childern[idx];ans += node.cnt;}else break;}return ans;}public int[] sumPrefixScores(String[] words) {int n = words.length;int[] ans = new int[n];for(int i = 0;i < n;i++) insert(words[i]);for(int i = 0;i < n;i++){ans[i] = get(words[i]);}return ans;}
}class Trie{int cnt;Trie[] childern;Trie(){cnt = 0;childern = new Trie[26];}
}

相关内容

热门资讯

公司旅游横幅怎么写   导语:旅游可以放松身心,开阔眼界,洗涤心境,可以见识一个世界大好河山。以下是小编整理了公司旅游横...
禁止大声喧哗的标语 禁止大声喧哗的标语  在生活、工作和学习中,大家或多或少都接触过一些经典的标语吧,标语起着警示人们的...
七夕主题标语 七夕主题标语(精选245句)  在日常学习、工作抑或是生活中,大家都有令自己印象深刻的标语吧,标语是...
正能量励志标语 正能量励志标语  在日常学习、工作抑或是生活中,许多人都接触过一些比较经典的标语吧,标语以其时间性、...
淘宝衣服好评评价语 淘宝衣服好评评价语  在淘宝上买衣服怎么给好评呢?以下是小编整理的淘宝衣服好评评价语,欢迎参考阅读!...
学校运动会方队口号 学校运动会方队口号(精选195句)  在平平淡淡的日常中,大家最不陌生的就是口号了吧,口号往往带有很...
交通标语警示语 交通标语警示语  在日常学习、工作或生活中,大家都看到过标语吧,通过标语,可以增强人们的社会责任心。...
女鞋店铺广告语 女鞋店铺广告语大全  广告语,又称广告词,广义的广告语指通过各种传播媒体和招贴形式向公众介绍商品、文...
消防宣传口号 消防宣传口号(精选50句)  在学习、工作或生活中,说到口号,大家肯定都不陌生吧,口号要在受众的心目...
牙膏广告语 牙膏广告语大全  牙膏有营养,牙齿好喜欢——纳爱斯牙膏  我最享受就是这种冰爽冲击——高露洁冰爽牙膏...
扔垃圾的文明标语 关于扔垃圾的文明标语(精选190句)  在现实生活或工作学习中,大家都不可避免地会接触到标语吧,标语...
作业批改激励性评语 作业批改激励性评语(精选110句)  在平凡的学习、工作、生活中,大家都经常接触到评语吧,评语是指含...
中华二十四孝经典标语 中华二十四孝经典标语  1、虞舜圣君·大孝感天  2、老莱七十·戏采娱亲  3、郯子鹿皮·取乳孝亲 ...
有关虎年开门红口号霸气押韵 有关虎年开门红口号霸气押韵  有关虎年开门红口号霸气押韵(精选200句)  在我们平凡的日常里,大家...
淘宝一些通用的好评评语 淘宝一些通用的好评评语  导语:淘宝网是亚太地区较大的网络零售、商圈,由阿里巴巴集团在2003年5月...
工厂质量口号霸气押韵 工厂有关质量口号霸气押韵  在平平淡淡的日常中,大家一定没少看到过口号吧,口号在句式上,除了简短,容...
防溺水标语 关于防溺水标语(精选50句)  在生活、工作和学习中,大家总少不了接触一些耳熟能详的标语吧,标语既有...
保护地球环境的标语 保护地球环境的标语  人类只有一个地球,而地球正在正面临着严重的环境危机,“拯救地球”已成为世界各国...
运动会方阵加油口号霸气 收藏 运动会方阵加油口号霸气 收藏  在平时的学习、工作或生活中,大家都接触过比较经典的口号吧,口号具有非...
小学班风班训口号 小学班风班训口号  口号是“供口头呼喊的有纲领性和鼓动作用的简短句子”。马克思主义哲学认为,物质决定...