D88696.CountBinarySubstrings题目链接696.CountBinarySubstrings题目分析给定一个01字符串,返回只能由连续的0和1字符串组成的二进制数字符串。比如00110011包括0011、01、1100、10、0011、01这6个数字,001100不算,因为这两个00是用11隔开的,不是连续的。思路一:生成01、0011、000111和10、1100、111000个字符串,然后用substr_count函数计算个数。但它会超时。函数countBinarySubstrings($s){$totalLength=strlen($s);$总计=0;for($i=0;$i<=$totalLength/2;$i++){//010011000111$boz=str_repeat('0',$i).str_repeat('1',$i);//101100111000$bzo=strrev($boz);$total+=substr_count($s,$boz);$total+=substr_count($s,$bzo);}return$total;}思路2使用stack的思路。先把数压入栈中,遇到不同的数弹出。当出栈完成后,将后面出现的数字放在最上面,作为下一个要出栈的栈。不过写起来有点麻烦。我写了一个错误的答案并放弃了。于是我又改变了主意。思路3只记录前一组是0还是1,以及出现的次数。先把字符串的第一个字符作为第一组字符。从第二个字开始判断。判断是否与第一组中出现的字符相同。如果相同则判断是否与前一个字符相同。这里需要注意的是,前一组的字符不一定等于前一组的字符。所以需要分别判断。如果与前一个字符相同,则前一组字符的个数(或长度)+1。如果与前一个字符不同,则说明两个相同的字符夹着不同的字符(如010或101)。那么此时就需要将上一组的内容全部丢弃。因为上一组没有内容可以匹配下一组。所以需要将当前组作为上一组,当前角色作为下一组。如果当前字符与之前设置的不同,则配对成功。上一组未配对字符数减1,当前组未配对字符数+1。这是因为当当前组变成上一组时,会匹配后面的字符,此时会减去对应的数字。因此这里需要+1。当上一组未配对的字符个数达到0时,说明上一组没有匹配的字符。因此,当前组取代了之前的组。如此循环即可。最终代码$val){if($stack1==$val){if($val==$prev){$stack1Amount++;}else{$stack1=$stack2;$stack1Amount=$stack2Amount;$stack2Amount=0;$堆栈2=空;}}if($stack1!=$val){$stack2=$val;$stack2Amount++;$stack1Amount--;$总++;}if($stack1Amount==0){$stack1=$stack2;$stack1Amount=$stack2Amount;$堆栈2=空;$stack2Amount=0;}$prev=$val;}返回$总计;}}如果您觉得本文对您有用,欢迎用爱心集资
