LeetCode解法汇总2609. 最长平衡子字符串

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个仅由 0 和 1 组成的二进制字符串 s 。  

如果子字符串中 所有的 0 都在 1 之前 且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。请注意,空子字符串也视作平衡子字符串。 

返回  s 中最长的平衡子字符串长度。

子字符串是字符串中的一个连续字符序列。

示例 1:

输入:s = "01000111"
输出:6
解释:最长的平衡子字符串是 "000111" ,长度为 6 。

示例 2:

输入:s = "00111"
输出:4
解释:最长的平衡子字符串是 "0011" ,长度为  4 。

示例 3:

输入:s = "111"
输出:0
解释:除了空子字符串之外不存在其他平衡子字符串,所以答案为 0 。

提示:

  • 1 <= s.length <= 50
  • '0' <= s[i] <= '1'

解题思路:

使用num0记录0出现的次数,num1记录1出现的次数。
遍历字符串,组合一下一共分为四种情况:
1.当前的字符为'0',并且num1>0,则说明进入新一个平衡字符串的遍历,则把num0和num1置空。num0记录当次则为1;
2.当前的字符为'0',并且num1=0,则说明在新一个平衡字符串的遍历中记录0出现的次数,则num0+1即可;
3.当前的字符为'1',并且num0>0,则说明在平衡字符串的遍历中,进入到1的部分,取0和1的较小值和maxNum比较;
4.当前的字符为'1',并且num0=0,则无需处理。

代码:

class Solution2609
{
public:
    int findTheLongestBalancedSubstring(string s)
    {
        int maxNum = 0;
        int num0 = 0;
        int num1 = 0;
        const char *c = s.c_str();
        for (int i = 0; i < s.length(); i++)
        {
            if (c[i] == '0')
            {
                if (num1 > 0)
                {
                    num0 = 0;
                    num1 = 0;
                }
                num0++;
                continue;
            }
            if (num0 > 0)
            {
                num1++;
                maxNum = max(maxNum, min(num0, num1));
            }
        }
        return maxNum * 2;
    }
};

你可能感兴趣的:(编程题,leetcode,算法,职场和发展)