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]
.
- For example, if
words = ["a", "ab", "abc", "cab"]
, then the score of"ab"
is2
, since"ab"
is a prefix of both"ab"
and"abc"
.
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:
1 <= words.length <= 1000
1 <= words[i].length <= 1000
words[i]
consists of lowercase English letters.
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:
- Time complexity : O(n).
- Space complexity : O(n).