题目链接及描述
649. Dota2 参议院 - 力扣(LeetCode)
题目分析
题目描述的意思:对于一个字符串循环执行抵消操作,(R的个数为1时可以使后续的一个D失效,D的个数为1时可以使后续的一个R失效)【相当于把初始字符串看作循环字符串】不断遍历,直至字符串中只剩下同一字符为止。
初步分析,这道题目只需要设计一个死循环,在循环中每次遍历给定字符串senate,循环遍历结束后判断每次循环后生成的新字符串temp是否符合循环终止条件(只剩下同一字符),若符合循环终止条件:
- 新字符串temp中只剩下单一字符D,此时返回“Dire”。
- 新字符串temp中只剩下单一字符R,此时返回“Radiant”。
若其不符合循环终止条件,则将遍历生成的字符串temp赋值给senate,继续进行遍历抵消操作。
本题难点:
- 遍历过程中记录字符R和D的个数,如果RNums > 0 && ch == D,此时新遍历到的字符D可以抵消(删除,不加入新字符串temp),同时将RNums--。同理:对于DNums > 0 && ch == R,此时新遍历到的字符串R可以抵消,同时将DNums--。
- 如果遍历过程中不会产生抵消,则遍历到ch == R对RNums++,如果遍历到ch == D对DNums++。
- 对字符串senate遍历过程中,如果记录新生成的字符串temp是否由单一字符构成。
- 遍历结束后再次遍历字符串temp判断是否为同一字符构成。
- 在循环遍历外层,定义标志位RFlag = false 和 DFlag = false,遍历过程中如果temp中加入字符R则将标志位RFlag置为 true;遍历过程中如果temp中加入字符D则将标志位DFlag置为true。遍历结束后如果根据RFlag和DFlag的值判断字符串temp是否为单一字符构成。
- RFlag == true && DFlag == false,由单一字符R构成。
- RFlag == false && DFlag == true,由单一字符D构成。
代码编写
class Solution {
public String predictPartyVictory(String senate) {
int RNums = 0, DNums = 0;
while(true){
boolean RFlag = false, DFlag = false;
String temp = "";
for(char ch : senate.toCharArray()){
if(ch == 'R' && DNums > 0){
DNums--;
continue;
}
if(ch == 'D' && RNums > 0){
RNums--;
continue;
}
if(ch == 'R'){
RNums++;
RFlag = true;
}
if(ch == 'D'){
DNums++;
DFlag = true;
}
temp += ch;
}
if(RFlag == true && DFlag == false){
return "Radiant";
}
if(RFlag == false && DFlag == true){
return "Dire";
}
senate = temp;
}
}
}