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];}
}

相关内容

热门资讯

赞美人才华横溢的诗句 赞美人才华横溢的诗句  在平平淡淡的日常中,大家总免不了要接触或使用诗句吧,诗句语言言简义丰,具有凝...
初中必背古诗词 初中必背古诗词80首  伟大的诗词,因为有你,天空不现阴暗。当乌云褪尽的时候,蓝天上灿烂的阳光会照亮...
形容中秋团圆的诗句有哪些 形容中秋团圆的诗句有哪些  从古到今,中秋节这一天人们都要吃月饼以示“团圆”,每逢中秋,我们家总要叫...
立夏最美的古诗句 立夏最美的古诗句合集  无论在学习、工作或是生活中,大家或多或少都接触过一些经典的古诗吧,古诗有固定...
靖安宅里当窗柳,望驿台前扑地... “靖安宅里当窗柳,望驿台前扑地花。”出处 出自 唐代 白居易 的《望驿台》“靖安宅里当窗柳,望驿台前...
祝福朋友的诗句 祝福朋友的诗句祝福朋友的诗句1  1、宿草春风又,新阡去岁无。杨万里《寒食上冢》  2、巾发雪争出,...
黄鹤楼送孟浩然之广陵原文和译... 《黄鹤楼送孟浩然之广陵》是唐代伟大诗人李白的名篇之一。这是一首送别诗,寓离情于写景。首句点出送别的地...
描写乡情的诗句 描写乡情的诗句  对乡村的爱会随着岁月的.迁移凝结成浓浓的情,关于描写乡情的诗句有哪些呢?下面小编为...
李隆基和杨玉环之间的故事 李隆基和杨玉环之间的故事  李隆基和杨玉环之间有许多的故事,比如定情册封、华清池赐浴、贵妃醉酒等等,...
更吹羌笛关山月 无那金闺万里... 边塞诗句“更吹羌笛《关山月》,无那金闺万里愁。”关山月边塞诗句“更吹羌笛《关山月》,无那金闺万里愁。...
赞美草的诗句 赞美草的诗句  草木知春不久归,百般红紫斗芳菲。下面是小编收集整理的赞美草的.诗句,如果你觉得不错的...
苏轼描写中秋节的诗句 苏轼描写中秋节的诗句  苏轼是北宋中期文坛领袖,在诗、词、散文、书、画等方面取得很高成就。以下小编为...
蜜蜂采蜜的诗句 有关蜜蜂采蜜的诗句  诗句就是组成诗词的`句子。诗句通常按照诗文的格式体例,限定每句字数的多少。下面...
郁达夫 故都的秋赏析 郁达夫 故都的秋赏析郁达夫(1896年12月7日—1945年9月17日),浙江富阳人,中国现代著名小...
赏心悦目的中秋节藏头诗大全   欢度中秋  五州宾朋同欢庆,  湖波秋色几度平,  四世共赏心中月,  海内知己恋秋情。  中秋...
描写鸟的诗句古诗 描写鸟的诗句古诗  小河的流水声,像拨动了的琴弦,流下潺潺的'流水声,树上的小鸟在树上跳来跳去,用清...
襄邑道中经典古诗阅读答案 襄邑道中经典古诗阅读答案  【原文】  襄邑道中  陈与义  飞花两岸照船红,百里榆堤半日风。  卧...
李白《秋浦歌》译文及赏析 李白《秋浦歌》译文及赏析  《秋浦歌十七首》是唐代伟大诗人李白的组诗作品。这组诗创作于唐玄宗天宝年间...
目送征鸿飞杳杳,思随流水去茫... “目送征鸿飞杳杳,思随流水去茫茫。”出处 出自 五代 孙光宪 的《浣溪沙·蓼岸风多橘柚香》“目送征鸿...
庄周梦蝶古诗 庄周梦蝶古诗  每日每夜,我依靠着忙碌的步履,在桌台上敲击着零散的字母,也许我是想建筑一座宏伟的堡垒...