最長01子串

2021-07-11 06:15:37 字數 1329 閱讀 1540

【題目】

給定乙個陣列,陣列中只包含0和1。請找到乙個最長的子串行,其中0和1的數量是相同的。

例1:10101010     結果就是其本身。

例2:1101000       結果是110100

【解析】

這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。

但找狀態轉移方程,我們要對原來的陣列進行變換一下。原來是0和1的串,我們將0都換為-1。

這樣題目目標就變成,找到乙個最長的子串,子串數字和是0。設原陣列為a, dp[i]表示從0開始到i的子陣列和。dp遍歷一遍陣列即可。

例1中的陣列產生的dp為:

再看例子2:

上面這兩個例子,所求的子串都是從頭開始,如果不是從頭開始,會是什麼樣的呢?看這個例子:1101100

我們用map儲存dp的值到位置的對映,如下表:

我們最終的演算法,要綜合考慮最常穿是否從頭開始的。 上面的這個思路,時間複雜度是o(n),空間複雜度也是o(n).

還有其他的思路,例如dp儲存的是[0,i]的1的個數,那麼dp[j] - dp[i] * 2 == j - i則表明a[i+1]...a[j]是乙個滿足條件的串,

找到j-i最大的,就是最終的結果,這個思路的時間複雜度為o(n^2),空間複雜度為o(n).

#include#include#includeusing namespace std;

//最長的01字串

string maxsubstr(string str)

//統計最大01字串

int start = 0,end = 0,max = 0,begin;

mapm;

for(int i = 1;i <= len;i++)

else}}

return str.substr(start,max);

}int main(){

string str("01101100001");

cout<

最長01串 貪心

一行乙個整數,最長的0與 1的個數相等的子串的長度。1011 1111 1010 2 04 思路 統計0與1的個數在串裡相同且最大長度。可以見0就讓ans 1就 當值為0的時候就比較一下當前的ma與i 1的大小 但是有個問題就是當為000000000001111111111111 0的個數 1的個數...

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...