5492 分割字串的方案數

2021-10-24 09:28:35 字數 2074 閱讀 5661

題目描述:

給你乙個二進位制串 s (乙個只包含01的字串),我們可以將 s 分割成 3 個 非空 字串s1,s2,s3s1 + s2 + s3 = s)。

請你返回分割s的方案數,滿足s1s2s3中字元 『1』 的數目相同。

由於答案可能很大,請將它對10^9 + 7取餘後返回。

示例 1:

輸入:s =

"10101"

輸出:4

解釋:總共有 4 種方法將 s 分割成含有 '1' 數目相同的三個子字串。

"1|010|1"

"1|01|01"

"10|10|1"

"10|1|01"

示例 2:

輸入:s =

"1001"

輸出:0

示例 3:

輸入:s =

"0000"

輸出:3

解釋:總共有 3 種分割 s 的方法。

"0|0|00"

"0|00|0"

"00|0|0"

示例 4:

輸入:s =

"100100010100110"

輸出:12

s[i] == 『0』 或者 s[i] == 『1』

3 <= s.length <= 10^5

解題思路:

1)、vectorvi:記錄所有『1』的位置;

2)、當vi.size() == 0: 不存在『1』的位置;計算方式是

「0000」

1:當乙個切分點含有2個『0』時, 有一種方式; 1

2:當乙個切分點含有1個『0』時,第二個切分點有兩種選擇2個『0』和乙個『0』, 有一種方式; 2

(1 + 2) * 2 / 2 = 3 種 ;

3)、當『1』的個數不是3 的倍數,則 輸出 0 ;

3)、當存在 3的倍數的『1』的位置資訊;

int first , second ;

first = vi[numi] - vi[numi - 1] ;

second = vi[numi << 1] - vi[(numi << 1) - 1] ;

ret = (long long) first * second ;

ret即為所要求的切分的個數;

**實現:

class

solution

if(vi.

size()

%3!=0

)return0;

else numi = vi.

size()

/3;//當『1』的個數 == 3i的時候;

int first , second ;

first = vi[numi]

- vi[numi -1]

; second = vi[numi <<1]

- vi[

(numi <<1)

-1];

ret =

(long

long

) first * second ;

return ret %

1000000007;}

};

複雜度計算:

時間複雜度:o(n)

空間複雜度:o(n); 儲存『1』的位置資訊的消耗;

leetcode 1573 分割字串的方案數

分割字串的方案數 給你乙個二進位制串 s 乙個只包含 0 和 1 的字串 我們可以將 s 分割成 3 個 非空 字串 s1,s2,s3 s1 s2 s3 s 請你返回分割 s 的方案數,滿足 s1,s2 和 s3 中字元 1 的數目相同。由於答案可能很大,請將它對 10 9 7 取餘後返回。示例 1...

1221 分割平衡字串

鏈結 在乙個 平衡字串 中,l 和 r 字元的數量是相同的。給出乙個平衡字串 s,請你將它分割成盡可能多的平衡字串。返回可以通過分割得到的平衡字串的最大數量。示例 1 shell 輸入 s rlrrllrlrl 輸出 4 解釋 s 可以分割為 rl rrll rl rl 每個子字串中都包含相同數量的...

1 8 分割字串(spilt )

string 類的split 方法可以按指定的分割符對目標字串進行分割,分割後的內容存放在字串陣列中。該方法主要有如下兩種過載形式 其中它們的含義如下 str 為需要分割的目標字串。sign 為指定的分割符,可以是任意字串。limit 表示分割後生成的字串的限制個數,如果不指定,則表示不限制,直到將...