> 文档中心 > 【力扣题解】1221. 分割平衡字符串

【力扣题解】1221. 分割平衡字符串


😊博主目前也在学习,有错误欢迎指正😊
🌈保持热爱 奔赴星海🌈

文章目录

    • 一、题目
      • 1、题目描述
      • 2、基础框架
      • 3、原题链接
    • 二、解题报告
      • 1、思路分析(解法一)
      • 2、代码详解(解法一)
      • 1、思路分析(解法二)
      • 2、代码详解(解法二)

一、题目

1、题目描述

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

2、基础框架

  • Java版本框架代码如下:
class Solution {    public int balancedStringSplit(String s) { }}

3、原题链接

1221. 分割平衡字符串

二、解题报告

1、思路分析(解法一)

       (1)从左向右遍历字符串,如果是L,则cnt减一,否则加一。
       (2)如果cnt的值等于一,说明L和R的数量相等,说明i左边是平衡子字符串。res++。

2、代码详解(解法一)

class Solution {    public int balancedStringSplit(String s) { int res = 0; int cnt = 0; char[] tmp = s.toCharArray(); for(int i = 0;i < tmp.length;i++) {     cnt += tmp[i] == 'L' ? -1:1;     if(cnt == 0) {  res++;     } } return res;    }}

1、思路分析(解法二)

       (1)定义两个双指针,若在左右指针之间的区间内是平衡字符串,res++,并且移动双指针。若不是平衡字符串,则右指针右移。
       (2)判断平衡的方法(isBalanced函数)是,先排序,再判断数组的左半部分和右半部分是否各自相等,并且左右部分不相等。

2、代码详解(解法二)

class Solution {    public int balancedStringSplit(String s) { int res = 0; int left = 0; int right = 1; while(right < s.length()) {     if(isBalanced(s.toCharArray(),left,right)) {  left = right + 1;  right = left + 1;  res++;     }else {  right++;     } } return res;    }    public boolean isBalanced(char[] arr,int left,int right) { if((right - left + 1)%2 == 1) {     return false; } if(right - left + 1 == 2) {     if(arr[left] == arr[right]) {  return false;     }else  {  return true;     } } Arrays.sort(arr,left,right + 1); int n = ((right - left) + 1)/2; char cur = arr[left]; for(int i = left + 1;i < left + n;i++) {     if(cur != arr[i]) {  return false;     } } if(cur == arr[left + n]) {     return false; } cur = arr[left + n]; for(int i = left + n + 1;i <= right;i++) {     if(cur != arr[i]) {  return false;     } } return true;    }}