分割平衡字符串

163 阅读2分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

问题描述

在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。
给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。
返回可以通过分割得到的平衡字符串的 最大数量 。(出自力扣题目)

示例

输入:s = "RLRRLLRLRL"
输出:4
解释:s 可以分割为 "RL""RRLL""RL""RL" ,每个子字符串中都包含相同数量的 'L''R' 。

输入:s = "RLLLLRRRLR"
输出:3
解释:s 可以分割为 "RL""LLLRRR""LR" ,每个子字符串中都包含相同数量的 'L''R' 。

输入:s = "LLLLRRRR"
输出:1
解释:s 只能保持原样 "LLLLRRRR".

解题思路

从题意可知,在这个“平衡字符串”里,'L' 和 'R' 字符的数量是相同的,也就是说,我们在这个字符串中间任何位置砍下一刀,将它分成两个字符串,如果其中有一个字符串是“平衡字符串”,那么另外一个也绝对是“平衡字符串”。从这个特点我们可以来循环这个“平衡字符串”,每次都从这个“平衡字符串”中分割出来一个最小的“平衡字符串”,分割出来后的剩下的那部分也还是“平衡字符串”,我们可以继续分割,直至分割出来的都不是“平衡字符串”就停止循环。

实现过程

思路大概是知道了,不过还有 一个问题就是我们要怎么来判断某个字符串到底是不是“平衡字符串”?
我们可以先声明一个变量timer,代表的是“L”出现的次数;若是循环到“L”,timer就加一,若是其他(肯定就是“R”了)就减一,当timer等于0时,就证明“L”和“R”出现的次数相等,这个字符串就是“平衡字符串”。

let nums = "LLRRLRLLLRRR"
function segmentation(strs) {
  let num = 0, timer = 0;
  for(let i=0; i<strs.length; i++) {
    if(strs[i] == "L") {
      timer++
    }else{
      timer--
    }
    if(timer === 0) {
      num++;
    }
  }
  return num;
}
console.log(segmentation(nums))