2416. Sum of Prefix Scores of Strings

Difficulty:
Related Topics:
    Similar Questions:

    Problem

    You are given an array words of size n consisting of non-empty strings.

    We define the score of a string word as the number of strings words[i] such that word is a prefix of words[i].

    Return **an array *answer* of size n where answer[i] is the sum of scores of every non-empty prefix of **words[i].

    Note that a string is considered as a prefix of itself.

      Example 1:

    Input: words = ["abc","ab","bc","b"]
    Output: [5,4,3,2]
    Explanation: The answer for each string is the following:
    - "abc" has 3 prefixes: "a", "ab", and "abc".
    - There are 2 strings with the prefix "a", 2 strings with the prefix "ab", and 1 string with the prefix "abc".
    The total is answer[0] = 2 + 2 + 1 = 5.
    - "ab" has 2 prefixes: "a" and "ab".
    - There are 2 strings with the prefix "a", and 2 strings with the prefix "ab".
    The total is answer[1] = 2 + 2 = 4.
    - "bc" has 2 prefixes: "b" and "bc".
    - There are 2 strings with the prefix "b", and 1 string with the prefix "bc".
    The total is answer[2] = 2 + 1 = 3.
    - "b" has 1 prefix: "b".
    - There are 2 strings with the prefix "b".
    The total is answer[3] = 2.
    

    Example 2:

    Input: words = ["abcd"]
    Output: [4]
    Explanation:
    "abcd" has 4 prefixes: "a", "ab", "abc", and "abcd".
    Each prefix has a score of one, so the total is answer[0] = 1 + 1 + 1 + 1 = 4.
    

      Constraints:

    Solution (Java)

    class Trie {
        Trie[] ch = new Trie[26];
        int visited = 0;
    }
    class Solution {
        public int[] sumPrefixScores(String[] words) {
            Trie trie = new Trie();
            int[] ans = new int[words.length];
            int k = 0;
            for (String x: words) {
                Trie t = trie;
                for (int i = 0; i < x.length(); i++) {
                    int c = x.charAt(i) - 'a';
                    if (t.ch[c] == null) t.ch[c] = new Trie();
                    t.ch[c].visited++;
                    t = t.ch[c];
                }
            }
            for (String x: words) {
                Trie t = trie; int curr = 0;
                for (int i = 0; i < x.length(); i++) {
                    int c = x.charAt(i) - 'a';
                    curr += t.ch[c].visited;
                    t = t.ch[c];
                }
                ans[k++] = curr;
            }
            return ans;
        }
    }
    

    Explain:

    nope.

    Complexity: