输入为一个字符串和这个字符串的长度,
实现的功能:例如字符串LRRLRL,L朝左,R朝右,类似于两个人,面面相对,其中一个人可以把另外一个人踹出队伍,
每次只有一对人可以踢出对方,不能很多人一起操作,
求最后最少可以留下多少人?
举例过程:LRRLRL->LRLRL->LRRL->LRL->LR(或者LL)
则最后最多剩下两人
方法:只有RL可以互相踢出对方,一共四种情况RRLR留下L; RRLL留下L;LRLL留下R; LRLR留下R
那么如何退出递归呢?
思路一:在递归的最后(在那里递归应该结束了),定义一个return函数,问题:只是结束了那一个递归,上面的递归还在继续,
core
(
s
,
s
.
size
());这个是结束了,但是还需要继续往下面执行,出现问题
思路2:定义一个flag变量,当应该结束的时候,将flag置为true,那么每次 循环的时候就会直接退出,然而,同上面的问题一样,
core
(
s
,
s
.
size
());这个是结束了,但是还需要继续往下面执行,这样就造成了不可知的错误,本题中最后的结果是LR,然后,
core
(
s
,
s
.
size
())结束后,重新回到上次的循环中len的值变为了3,这样就访问过界了。
bool flag =false;
void core(string &s,int len){
// if(flag) return ;
for (int i=0;i<len-1;i++)
{
if(i==0){
if(s[i]=='R' &&s[i+1]=='L'){
for(int j=i+1;j<len-1;j++) s[j]=s[j+1];
s = s.substr(0,len - 1);
core(s,s.size());
if(flag) return ;
}
}
if(i != 0){
if (s[i]=='R' &&s[i+1]=='L'){
if (s[i-1]=='R'){
for(int j=i;j<len-1;j++) s[j]=s[j+1];
s = s.substr(0,len - 1);
core(s,s.size());
if(flag) return ;
}
if (s[i-1]=='L'){
for(int j=i+1;j<len-1;j++) s[j]=s[j+1];
s = s.substr(0,len - 1);
core(s,s.size());
if(flag) return ;
}
}
}
}
// return ;
flag = true;
}