列表

详情


2416. 字符串的前缀分数和

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

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

返回一个长度为 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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> sumPrefixScores(vector<string>& words) { } };

python3 解法, 执行用时: 7312 ms, 内存消耗: 478.7 MB, 提交时间: 2022-10-19 14:53:58

class Trie:
    def __init__(self):
        self.child = [None for _ in range(26)]
        self.cnt = 0
    
    def insert(self, word: str) -> None:
        rt = self
        for c in word:
            ID = ord(c) - ord('a')
            if rt.child[ID] == None:
                rt.child[ID] = Trie()
            rt = rt.child[ID]
            rt.cnt += 1
        
    def qeury(self, prefix: str) -> int:
        rt = self
        res = 0
        for c in prefix:
            ID = ord(c)- ord('a')
            if rt.child[ID] == None:
                break
            rt = rt.child[ID]
            res += rt.cnt
        return res

class Solution:
    def sumPrefixScores(self, words: List[str]) -> List[int]:
        n = len(words)

        T = Trie()
        for word in words:
            T.insert(word)
        
        res = [0 for _ in range(n)]
        for i, word in enumerate(words):
            res[i] = T.qeury(word)
        return res

python3 解法, 执行用时: 2352 ms, 内存消耗: 265.4 MB, 提交时间: 2022-10-19 14:53:10

Trie = lambda : defaultdict(Trie)
CNT = '#'

class Solution:
    def sumPrefixScores(self, words: List[str]) -> List[int]:
        tr = Trie()
        for w in words:
            cur = tr
            for ch in w:
                cur = cur[ch]
                cur[CNT] = cur.get(CNT, 0) + 1
        
        res = []
        for w in words:
            cur, ans = tr, 0
            for ch in w:
                cur = cur[ch]
                ans += cur[CNT]
            res.append(ans)
        return res

python3 解法, 执行用时: 7124 ms, 内存消耗: 590.2 MB, 提交时间: 2022-10-19 14:51:13

class Solution:
    def sumPrefixScores(self, words: List[str]) -> List[int]:
        cnt = Counter(w[:i+1] for w in words for i in range(len(w)))
        return [sum(cnt[w[:i+1]] for i in range(len(w))) for w in words]

上一题