题目:
You are playing the following Flip Game with your friend: Given a string that contains only these two characters: +
and -
, you and your friend take turns to flip two consecutive "++"
into "--"
. The game ends when a person can no longer make a move and therefore the other person will be the winner.
Write a function to determine if the starting player can guarantee a win.
For example, given s = "++++"
, return true. The starting player can guarantee a win by flipping the middle "++"
to become "+--+"
.
Follow up:
Derive your algorithm's runtime complexity.
思路:
这里需要注意一个转换:你自己可以保证赢的充要条件是你走完某一步之后,你的对手不可能赢。所以我们维护一个哈希表,里面记录所有不可能赢的字符串,一旦发现你走了某一步使得对手不可能赢,那么你就可以保证赢,否则你就不能保证你会赢。
代码:
class Solution {
public:
bool canWin(string s) {
if (s.length() <= 1) {
return false;
}
if(hash.count(s)) {
return false;
}
for(int i = 0; i < s.length() - 1; ++i) {
if (s[i] == '+' && s[i + 1] == '+') {
string str(s);
str[i] = str[i + 1] = '-';
if(!canWin(str)) { // if the opposite cannot win, then you can gaurantee to win
hash.insert(str);
return true;
}
}
}
return false;
}
private:
unordered_set<string> hash;
};