嗨!~ 大家好,我是YK菌 🐷 ,一个微系前端 ✨,喜欢分享自己学到的小知识 🏹,欢迎关注我呀 😘 ~ [微信号:
yk2012yk2012,微信公众号:ykyk2012]
「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
中等、困难题我唯唯诺诺,简单题我重拳出击,今天再来做一道简单题增增自信,分割平衡字符串。
1221. 分割平衡字符串
在一个 平衡字符串 中,
'L'和'R'字符的数量是相同的。
给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。
注意:分割得到的每个字符串都必须是平衡字符串。 返回可以通过分割得到的平衡字符串的 最大数量 。
示例
- 输入:
s = "RLRRLLRLRL" - 输出:
4 - 解释:
s可以分割为"RL"、"RRLL"、"RL"、"RL",每个子字符串中都包含相同数量的'L'和'R'。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/sp…
题解
刚拿到这题,其实想的是到底怎么分割呢? 这种对称的问题是不是需要一个栈呢? 其实再仔细想想平衡字符串的定义,就可以找到解决方案了。不需要数据结构,直接遍历一遍即可得到答案
其实我们根据平衡字符串的定义可以知道:对于一个平衡字符串被分成两个,只要第一个是平衡字符串,那另一个就一定也是平衡字符串。
所以我们在得到分割字符串的时候,只需要从前向后遍历,遇到一个最小的平衡字符串就分割,然后在字符串后面继续分割,因为后面的这个字符串也是一个平衡字符串。
/**
* @param {string} s
* @return {number}
*/
var balancedStringSplit = function(s) {
// 平衡因子
let balance = 0
// 平衡子串数量
let result = 0
// 开始遍历字符串
for(let i = 0; i < s.length; i++){
// 拿到当前字符
let char = s[i]
// 如果是 L 就让平衡因子加一
if(char === 'L'){
balance++
}else{
// 如果是 R 就让平衡因子减一
balance--
}
// 如果平衡因子为0,平衡子串数量加一
if(balance === 0){
result++
}
}
// 也就是说答案就是一次遍历过程中,平衡因子归零的次数
return result
};
运行结果
最后,欢迎关注我的专栏,和YK菌做好朋友~