• 计数二进制字符串


    Leetcode题目描述

    给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。

    重复出现的子串要计算它们出现的次数。

    示例 1 :

    输入: "00110011"
    输出: 6
    解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
    
    请注意,一些重复出现的子串要计算它们出现的次数。
    
    另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
    

    示例 2 :

    输入: "10101"
    输出: 4
    解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
    

    注意:

    s.length 在1到50,000之间。
    s 只包含“0”或“1”字符。
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/count-binary-substrings

    暴力破解

    • 当前非空连续相同的字符子串(其字符总数为(n_1))与下个非空连续相同的字符字串(其子串字符总数(n_2)), 两者所可以产生的数量相同的最大值为(if(n_2 > n_1) quad return quad n_1),也即是(n_1),最小值为(if(n_2 < n_1)quad return quad n_2),也就是(n_2)
    • 计算一次结果之后,便可以跳过当前所在重复子串所在的区域,指向下一个连续相同子串的初始位置

    Demo

    class Solution {
        /**
         * 统计字符串s中一段相同字符的数量
         * @param s 目的字符串
         * @param i 最先开始定位的值
         * @return
         */
        public int countSameString(String s, int i){
            int nums = 0;
            if(i >= s.length()) return 0;
            char c = s.charAt(i);
            while(i + nums < s.length()){
                if(c == s.charAt(i + nums)) nums++;
                else break;
            }
            return nums;
        }
    
        /**
         * 返回所有可能的组合结果
         *
         * @param s 输入的字符串
         * @return 能够符合条件的组合总数
         */
        public int countBinarySubstrings(String s) {
            int n = s.length();
            int thisnums = 0, nextnums = 0;
            int i = 0;
            int res = 0;
            while(i != n){
                thisnums = countSameString(s,i);
                nextnums = countSameString(s,i+thisnums);
                if(i + thisnums >= n){
                    nextnums = 0;
                }
                if(thisnums > nextnums){
                    res += nextnums;
                }
                else{
                    res += thisnums;
                }
                i = i + thisnums;
            }
            return res;
        }
    }
    
  • 相关阅读:
    闭包Closures
    jsp中的四种对象作用域
    JFrame小练习1
    swift函数的用法,及其嵌套实例
    图的储存
    洛谷P3366 【模板】最小生成树(Kruskal && Prim)
    洛谷P3371 【模板】单源最短路径(弱化版)(SPFA解法)
    POJ 1577 Falling Leaves
    POJ 3784 Running Median
    洛谷P3374 【模板】树状数组 1
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13784607.html
Copyright © 2020-2023  润新知