有一点点像是博弈的过程,就像是打牌。
题目大意:就是给你字符串,如果顺序靠前,那么我可以限制后面的人。比如我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。
最后我们判断出哪一个队列还有元素,如果还有元素,表示胜利方。