leetcode0-649. Dota2 参议院

leetcode0-649. Dota2 参议院_第1张图片
leetcode0-649. Dota2 参议院_第2张图片

有一点点像是博弈的过程,就像是打牌。
题目大意:就是给你字符串,如果顺序靠前,那么我可以限制后面的人。比如我RD,当前的第一个字符是R,那么我可以束缚后面的D。

一开始可能有点模拟不出来。但是稍微看了答案之后大概明白意思:
分析如下:
用队列去模拟出每一个字符串出现的位置,这样也像是模拟出了字符串的顺序。

如果R在D之前,那么我可以弹出D。然后我同样去在队尾加入R,表示出R的优先级稍微高一点。
如果重复了多次操作,我们不妨猜想一下如果R很多,那么我们在弹出D的时候,我们的R还是插入了队列的尾端。
这更像是一个博弈性质的模拟。

代码如下:

class Solution {
public:
    string predictPartyVictory(string s) {
        //算是一个博弈的过程,其实也像是模拟的过程
        queue<int> d,r;
        for(int i=0;i<s.size();i++){
            if(s[i]=='R') r.push(i);
            else d.push(i); 
        }
        //现在开始去模拟,算是一个贪心的过程,弹出对象最早出现的一个
        while(!r.empty()&&!d.empty()){
            //说明q的优先级更高,可以弹出d的一个最近的对象
            if(r.front()<d.front()) r.push(r.front()+s.size());
            else d.push(d.front()+s.size());
            r.pop(),d.pop(); 
        }
        return !r.empty()?"Radiant":"Dire";
    }
};

按照代码稍微模拟一下就好啦,还是比较简单的。其实模拟一下就清清楚楚了。

比如此时的字符串是 RDD。
那么我们按照字符的索引就是:

R:0
D:1 2

那么我们博弈的过程如下:
第一个R比D早出现,那么我可以将D给驱逐出去,也就是弹出队列。但是此时我还要将D放到队尾,因为此时的索引的位置间接的代表了权力。
此时队列的过程如下:

R:3
D:2

那么此时D的第一个字符更早出现,那么此时弹出R,保留D。

最后我们判断出哪一个队列还有元素,如果还有元素,表示胜利方。

你可能感兴趣的:(leetcode,队列,字符串,数据结构,栈)