Leetcode PHP题解--D88 696. Count Binary Substrings

D88 696. Count Binary Substrings

题目连接

696. Count Binary Substringsphp

题目分析

给定一个01字符串,返回仅用连续的0和1串所能组成的二进制字符串个数。函数

例如,00110011,就包含001101110010001101共6个。001100则不算,由于两个00被11分割开了,不是连续的。.net

思路

思路1:

生成01,0011,000111和10,1100,111000字符串,再用substr_count函数去计算个数的。可是会超时。code

function countBinarySubstrings($s) {
    $totalLength = strlen($s);
    $total = 0;
    for($i=0;$i<=$totalLength/2; $i++){
        //01 0011 000111
        $boz = str_repeat('0',$i).str_repeat('1',$i);
        //10 1100 111000
        $bzo = strrev($boz);
        $total += substr_count($s, $boz);
        $total += substr_count($s, $bzo);
    }
    return $total;
}

思路2

用栈的思想。先把数字压入栈内,遇到不一样数字时出栈。出完栈时,把后面出现的数字顶上,做为下一个出栈的栈。然而写起来略嫌麻烦。写了个Wrong Answer出来就放弃了。因而又换了个思路。leetcode

思路3

只记录前一组是0仍是1,以及出现的次数。字符串

先取字符串的第一个字符做为第一组的字符。
从第二个字符开始判断。
判断是否与第一组出现的字符相同。相同,则判断是否与前一个字符相同。这里须要注意的是,前一组的字符不必定等于前一个字符。因此须要分开判断。
若是与前一个字符相同,则给前一组字符出现个数(或者叫长度)+1。若是与前一个字符不一样,则说明两个相同的字符夹住了不一样的字符(例如010或者101)。那么此时须要抛弃前一组的全部内容。由于前一组已经没有内容能够和下一组匹配了。因此须要把当前组做为前一组,把当前字符做为下一组。get

若是当前字符与前一组的字符不一样,则说明配对成功。
前一组未配对字符数量减1,当前组未配对数量+1。这里是由于,当前在变成前一组的时候,会与其后面的字符匹配,到时候会减去对应数量。所以这里须要+1。string

当前一组未配对字符数量达到0时,说明前一组已经没有能够匹配的字符。故把当前组替换未前一组。it

如此循环便可。io

最终代码

<?php
class Solution {
    /**
     * @param String $s
     * @return Integer
     */
    function countBinarySubstrings($s) {
        $total = 0;
        $s = str_split($s);
        $stack1 = array_shift($s);
        $stack1Amount = 1;
        $stack2 = null;
        $stack2Amount = 0;
        $prev = $stack1;
        foreach($s as $key => $val){
            if($stack1 == $val){
                if($val == $prev){
                    $stack1Amount++;
                }
                else{
                    $stack1 = $stack2;
                    $stack1Amount = $stack2Amount;
                    $stack2Amount = 0;
                    $stack2 = null;
                }
            }
            if($stack1 != $val){
                $stack2 = $val;
                $stack2Amount++;
                $stack1Amount--;
                $total++;
            }
            if($stack1Amount == 0){
                $stack1 = $stack2;
                $stack1Amount = $stack2Amount;
                $stack2 = null;
                $stack2Amount = 0;
            }
            $prev = $val;
        }
        return $total;
    }
}

若以为本文章对你有用,欢迎用爱发电资助。

相关文章
相关标签/搜索