【題目】
給定乙個陣列,陣列中只包含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,且單獨佔一行 如果...