[Leetcode] 294. Flip Game II 解题报告

来源:互联网 发布:中国程序员网 编辑:程序博客网 时间:2024/05/24 03:30

题目

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;};