1221. 分割平衡字符串
在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。
给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
返回可以通过分割得到的平衡字符串的最大数量。
示例 1:
输入:s = “RLRRLLRLRL”
输出:4
解释:s 可以分割为 “RL”, “RRLL”, “RL”, “RL”, 每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’。
示例 2:
输入:s = “RLLLLRRRLR”
输出:3
解释:s 可以分割为 “RL”, “LLLRRR”, “LR”, 每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’。
示例 3:
输入:s = “LLLLRRRR”
输出:1
解释:s 只能保持原样 “LLLLRRRR”.
提示:
1 <= s.length <= 1000
s[i] = 'L' 或 'R'
分割得到的每个字符串都必须是平衡字符串。
题解:
首先明白此题平衡在于数量上的等于,与位置的摆放是没有关系的。
并且明确分割得到的每个字符串都要是平衡字符串。
而原先给你的也是一个平衡字符串。
所以我们可以从贪心的角度出发,即设置一个变量存储R出现的次数,再设置一个变量储存L出现的次数,一旦二者相等时立刻进行 “切除” 操作,且由于你切的L与R个数相同,所以之后得到的也是一个平衡字符串。
即我们从贪心角度出发,秉着“能切则切”的原则即可。因为在原先是平衡字符串的情况下我们再切出来个平衡字符串剩下的一定也是平衡字符串。所以切后的情况我们是不用考虑的。
代码一:二变量储存+贪心
int balancedStringSplit(char * s){
int sumr = 0;
int suml = 0;
int sum = 0;//此为储存切出来的平衡字符串的个数
for(int i=0;i<strlen(s);i++)//遍历完全
{
if(s[i]=='R')
{
sumr++;
}
else if(s[i]=='L')
{
suml++;
}
if(sumr==suml)
{
sum++;
}
}
return sum;
}
后来发现其实可以不用遍历完全s数组,因为在已经是平衡字符串的情况下其最后一个字母可以不用看的,其一定宏观上保持着L个数==R个数。
因此我们可以这样考虑:
int balancedStringSplit(char * s){
int sumr = 0;
int suml = 0;
int sum = 1;//先为1,即由循环得到的sum其实是进行“切”的次数
for(int i=0;i+1<strlen(s);i++)//因为我们由循环是为了得到要进行“切 ”的次数
//所以最后一个字母可以不看,因为最后一个不用切了,其本身就是一个单独的个体
{
if(s[i]=='R')
{
sumr++;
}
else if(s[i]=='L')
{
suml++;
}
if(sumr==suml)
{
sum++;//可以切一次
}
}
return sum;
}
后来发觉好像一个变量储存R与L也可以诶。
只要先令此变量为0,然后碰到R就加一,碰到L就减一即可。这样若进行加一或减一操作后此变量仍为0则代表R与L的个数相同。
代码二:一变量储存+贪心
int balancedStringSplit(char * s){
int sign = 0;
int sum = 0;
int i =0;
while(i<strlen(s))
{
if(s[i++]=='R')//i++在这里了,因为不管if里的条件满不满足,其都要在这里进行一次判断
//成功的话执行if里的内容,不成功则不执行if里的内容,但是他们都会在条件判断后进行i++操作
{
sign++;
}
else//else执行条件是上面的if语句没有执行才可
{
sign--;
}
if(sign==0)
sum++;
}
return sum;
}