696. Count Binary Substringsphp
給定一個01字符串,返回僅用連續的0和1串所能組成的二進制字符串個數。函數
例如,00110011
,就包含0011
,01
,1100
,10
,0011
,01
共6個。001100
則不算,由於兩個00被11分割開了,不是連續的。spa
生成01,0011,000111和10,1100,111000字符串,再用substr_count函數去計算個數的。可是會超時。.net
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;
}
複製代碼
用棧的思想。先把數字壓入棧內,遇到不一樣數字時出棧。出完棧時,把後面出現的數字頂上,做爲下一個出棧的棧。然而寫起來略嫌麻煩。寫了個Wrong Answer出來就放棄了。因而又換了個思路。code
只記錄前一組是0仍是1,以及出現的次數。leetcode
先取字符串的第一個字符做爲第一組的字符。
從第二個字符開始判斷。
判斷是否與第一組出現的字符相同。相同,則判斷是否與前一個字符相同。這裏須要注意的是,前一組的字符不必定等於前一個字符。因此須要分開判斷。
若是與前一個字符相同,則給前一組字符出現個數(或者叫長度)+1。若是與前一個字符不一樣,則說明兩個相同的字符夾住了不一樣的字符(例如010或者101)。那麼此時須要拋棄前一組的全部內容。由於前一組已經沒有內容能夠和下一組匹配了。因此須要把當前組做爲前一組,把當前字符做爲下一組。字符串
若是當前字符與前一組的字符不一樣,則說明配對成功。
前一組未配對字符數量減1,當前組未配對數量+1。這裏是由於,當前在變成前一組的時候,會與其後面的字符匹配,到時候會減去對應數量。所以這裏須要+1。get
當前一組未配對字符數量達到0時,說明前一組已經沒有能夠匹配的字符。故把當前組替換未前一組。string
如此循環便可。it
<?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;
}
}
複製代碼
若以爲本文章對你有用,歡迎用愛發電資助。