Skip to content

Commit d10c501

Browse files
committed
1 parent 77dd79b commit d10c501

6 files changed

+174
-27
lines changed

Diff for: README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[LeetCode solutions](http://maskray.me/blog/2014-06-29-leetcode-solutions) gives some thoughts on selected problems.
44

5-
Solved 273/273 problems.
5+
Solved 277/277 problems.
66

77
## Database
88

@@ -12,6 +12,10 @@ See [database.md](database.md)
1212

1313
| # | Title | Solution |
1414
|---| ----- | -------- |
15+
|294|[Flip Game II](https://leetcode.com/problems/flip-game-ii/)|[flip-game-ii.cc](flip-game-ii.cc)|
16+
|293|[Flip Game](https://leetcode.com/problems/flip-game/)|[flip-game.cc](flip-game.cc)|
17+
|292|[Nim Game](https://leetcode.com/problems/nim-game/)|[nim-game.cc](nim-game.cc)|
18+
|291|[Word Pattern II](https://leetcode.com/problems/word-pattern-ii/)|[word-pattern-ii.cc](word-pattern-ii.cc)|
1519
|290|[Word Pattern](https://leetcode.com/problems/word-pattern/)|[word-pattern.cc](word-pattern.cc)|
1620
|289|[Game of Life](https://leetcode.com/problems/game-of-life/)|[game-of-life.cc](game-of-life.cc)|
1721
|288|[Unique Word Abbreviation](https://leetcode.com/problems/unique-word-abbreviation/)|[unique-word-abbreviation.cc](unique-word-abbreviation.cc)|

Diff for: expression-add-operators.cc

+83-26
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,94 @@
11
// Expression Add Operators
2+
3+
/// like Earley parser, O(4^n) (string concatenation treated as O(1))
4+
5+
typedef long long ll;
26
class Solution {
3-
private:
4-
string num;
5-
int target;
6-
vector<string> r;
7-
void dfs(int k, long v, long p, int sgn, string s) {
8-
if (k == num.size()) {
9-
if (v+p == target) {
10-
s.pop_back();
11-
r.push_back(s);
12-
}
7+
string a;
8+
int n, target;
9+
vector<string> res;
10+
void forward(int k, string s, ll add, ll mul, ll last) {
11+
ll sum = add+mul*last;
12+
if (k == n) {
13+
if (sum == target)
14+
res.push_back(s);
15+
return;
16+
}
17+
int x = a[k]-'0';
18+
if (last) // no leading zero
19+
forward(k+1, s+a[k], add, mul, last*10+x);
20+
forward(k+1, s+'*'+a[k], add, mul*last, x);
21+
forward(k+1, s+'+'+a[k], sum, 1, x);
22+
forward(k+1, s+'-'+a[k], sum, -1, x);
23+
}
24+
public:
25+
vector<string> addOperators(string num, int target) {
26+
a = num;
27+
n = a.size();
28+
if (n) {
29+
this->target = target;
30+
forward(1, string(1, a[0]), 0, 1, a[0]-'0');
31+
}
32+
return res;
33+
}
34+
};
35+
36+
/// accelerated by meet-in-the-middle, O(4^(n/2)*2^(n/2)) = O(2^(1.5n))
37+
38+
typedef long long ll;
39+
class Solution {
40+
string a;
41+
int n, nn, target;
42+
vector<multimap<ll, string>> e_plus, e_minus;
43+
vector<string> res;
44+
void backward(int k, string s, ll add, ll mul, ll last, ll ten) {
45+
if (k < nn) return;
46+
int x = a[k-1]-'0';
47+
ll ten2 = 10*ten, sum = add+mul*last;
48+
backward(k-1, string(1, a[k-1])+s, add, mul, last+ten2*x, ten2);
49+
if (ten == 1 || last >= ten) { // `last` has no leading zero
50+
backward(k-1, string(1, a[k-1])+'*'+s, add, mul*last, x, 1);
51+
backward(k-1, string(1, a[k-1])+'+'+s, sum, 1, x, 1);
52+
backward(k-1, string(1, a[k-1])+'-'+s, add-mul*last, 1, x, 1);
53+
e_plus[k].insert(make_pair(sum, s));
54+
e_minus[k].insert(make_pair(add-mul*last, s));
55+
}
56+
}
57+
void forward(int k, string s, ll add, ll mul, ll last) {
58+
ll sum = add+mul*last;
59+
if (k == n) {
60+
if (sum == target)
61+
res.push_back(s);
62+
return;
63+
}
64+
int x = a[k]-'0';
65+
if (last) // no leading zero
66+
forward(k+1, s+a[k], add, mul, last*10+x);
67+
forward(k+1, s+'*'+a[k], add, mul*last, x);
68+
if (k < nn) {
69+
forward(k+1, s+'+'+a[k], sum, 1, x);
70+
forward(k+1, s+'-'+a[k], sum, -1, x);
1371
} else {
14-
long x = 0;
15-
for (int i = k; i < num.size(); i++) {
16-
string ss = s + num.substr(k, i-k+1);
17-
x = x * 10 + num[i]-'0';
18-
long vv = (sgn ? sgn : p) * x;
19-
dfs(i+1, v+vv, 0, 1, ss+'+');
20-
if (i+1 < num.size()) {
21-
dfs(i+1, v+vv, 0, -1, ss+'-');
22-
dfs(i+1, v, vv, 0, ss+'*');
23-
}
24-
if (num[k] == '0') break;
25-
}
72+
auto rg = e_plus[k].equal_range(target-sum);
73+
for (auto it = rg.first; it != rg.second; ++it)
74+
res.push_back(s+'+'+it->second);
75+
rg = e_minus[k].equal_range(target-sum);
76+
for (auto it = rg.first; it != rg.second; ++it)
77+
res.push_back(s+'-'+it->second);
2678
}
2779
}
2880
public:
2981
vector<string> addOperators(string num, int target) {
30-
if (num.size()) {
31-
this->num = num;
82+
a = num;
83+
n = a.size();
84+
if (n) {
85+
nn = n/2; // 0 < nn < n
3286
this->target = target;
33-
dfs(0, 0, 0, 1, "");
87+
e_plus.resize(n);
88+
e_minus.resize(n);
89+
backward(n-1, string(1, a[n-1]), 0, 1, a[n-1]-'0', 1);
90+
forward(1, string(1, a[0]), 0, 1, a[0]-'0');
3491
}
35-
return r;
92+
return res;
3693
}
3794
};

Diff for: flip-game-ii.cc

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Flip Game II
2+
class Solution {
3+
public:
4+
bool canWin(string s) {
5+
vector<int> sg(s.size()+1, 0), t(s.size()+1, 0);
6+
int tick = 0;
7+
for (int i = 2; i <= s.size(); i++) {
8+
tick++;
9+
for (int j = i-2; j >= 0; j--)
10+
t[sg[j]^sg[i-2-j]] = tick;
11+
sg[i] = find_if(t.begin(), t.end(), bind(not_equal_to<int>(), placeholders::_1, tick)) - t.begin();
12+
}
13+
int sum = 0;
14+
for (auto i = s.begin(); i != s.end(); )
15+
if (*i == '-')
16+
++i;
17+
else {
18+
auto j = find(i, s.end(), '-');
19+
sum ^= sg[j-i];
20+
i = j;
21+
}
22+
return sum;
23+
}
24+
};

Diff for: flip-game.cc

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Flip Game
2+
class Solution {
3+
public:
4+
vector<string> generatePossibleNextMoves(string s) {
5+
vector<string> r;
6+
for (int i = 0; i+1 < s.size(); i++)
7+
if (s[i] == '+' && s[i+1] == '+') {
8+
r.push_back(s);
9+
r.back()[i] = '-';
10+
r.back()[i+1] = '-';
11+
}
12+
return r;
13+
}
14+
};

Diff for: nim-game.cc

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Nim Game
2+
class Solution {
3+
public:
4+
bool canWinNim(int n) {
5+
return n%4;
6+
}
7+
};

Diff for: word-pattern-ii.cc

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Word Pattern II
2+
class Solution {
3+
string p, s;
4+
unordered_map<char, string> mp;
5+
unordered_set<string> st;
6+
vector<int> freq;
7+
bool f(int i, int j, int b) {
8+
if (i == p.size())
9+
return j == s.size();
10+
if (b > s.size())
11+
return false;
12+
if (mp.count(p[i])) {
13+
auto &sub = mp[p[i]];
14+
if (s.substr(j, sub.size()) == sub && f(i+1, j+sub.size(), b))
15+
return true;
16+
} else {
17+
string sub;
18+
for (int l = 1; j+l <= s.size(); l++) {
19+
sub += s[j+l-1];
20+
if (! st.count(sub)) {
21+
st.insert(sub);
22+
mp[p[i]] = sub;
23+
if (f(i+1, j+l, b+freq[p[i]-'a']*l))
24+
return true;
25+
mp.erase(p[i]);
26+
st.erase(sub);
27+
}
28+
}
29+
}
30+
return false;
31+
}
32+
public:
33+
bool wordPatternMatch(string pattern, string str) {
34+
p = pattern;
35+
s = str;
36+
freq.resize(26);
37+
for (auto c: pattern)
38+
freq[c-'a']++;
39+
return f(0, 0, 0);
40+
}
41+
};

0 commit comments

Comments
 (0)