-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdaily100.cpp
More file actions
126 lines (111 loc) · 3.01 KB
/
Copy pathdaily100.cpp
File metadata and controls
126 lines (111 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Solution 1 - TOO SLOW
class Solution {
public:
vector<int> sumPrefixScores(vector<string>& words) {
/*
for every prefix of current string
find how many other words in the vector have that same prefix
*/
auto scores = std::vector<int>(words.size(), 0);
for (auto i = 0; i < words.size(); ++i) {
auto curr = std::string{words[i][0]};
auto index = 1;
auto total = 0;
while (curr.size() <= words[i].size()) {
for (auto& w : words) {
if (curr == w.substr(0, curr.size()))
total++;
}
curr += words[i][index];
index++;
}
scores[i] = total;
}
return scores;
}
};
// Solution 2- FASTER, but still TOO SLOW
class Solution {
public:
vector<int> sumPrefixScores(vector<string>& words) {
auto scores = std::vector<int>(words.size(), 0);
auto prefixes = std::unordered_map<std::string, int>{};
for (auto i = 0; i < words.size(); ++i) {
for (auto j = 1; j <= words[i].size(); ++j) {
auto prefix = words[i].substr(0, j);
if (!prefixes.contains(prefix))
prefixes[prefix] = 0;
prefixes[prefix]++;
}
}
for (auto i = 0; i < words.size(); ++i) {
auto total = 0;
for (auto j = 1; j <= words[i].size(); ++j) {
auto prefix = words[i].substr(0,j);
total += prefixes[prefix];
}
scores[i] = total;
}
return scores;
}
};
// Solution 3
struct Node{
int count=0;
Node *list[26]={NULL};
bool containKey(char ch){
return list[ch-'a']!=NULL;
}
Node *get(char ch){
return list[ch-'a'];
}
void put(char ch,Node *new_node){
list[ch-'a']=new_node;
}
void inc(char ch){
list[ch-'a']->count+=1;
}
int retCount(char ch){
return list[ch-'a']->count;
}
};
class Solution {
private:
Node *root;
public:
Solution(){
root=new Node;
}
void insert(string word){
Node *node=root;
for(auto ch:word){
if(!node->containKey(ch)){
node->put(ch,new Node);
}
node->inc(ch);
node=node->get(ch);
}
}
int search(string word){
Node *node=root;
int preCount=0;
for(auto ch:word){
preCount+=node->retCount(ch);
node=node->get(ch);
}
return preCount;
}
vector<int> sumPrefixScores(vector<string>& words) {
//This problem can be solved using the trie data structure
for(auto word:words){
insert(word);
}
int n=words.size();
vector<int>res(n);
for(int i=0;i<n;i++){
int preCount=search(words[i]);
res[i]=preCount;
}
return res;
}
};