題目**,
原題
給定乙個陣列,陣列中只包含0和1。請找到乙個最長的子串行,其中0和1的數量是相同的。
例1:10101010 結果就是其本身。
例2:1101000 結果是110100
請大家展開自己的思路。
分析
這個題目,看起來比較簡單,一些同學可能認為題目的描述符合動態規劃的特徵,然後就開始用動態規劃解,努力找狀態轉移方程。這些同學的感覺,是很正確的。但,找狀態轉移方程,我們要對原來的陣列進行變換一下。
原來是0和1的串,我們將0都換為-1。這樣題目目標就變成,找到乙個最長的子串,子串數字和是0。設原陣列為a, dp[i]表示從0開始到i的子陣列和。dp遍歷一遍陣列即可。例1中的陣列產生的dp為:01
2345
6710
1010
10這個例子,最後乙個值是0,並且長度是偶數字。直接滿足了結果。
再看例子2:01
2345
6121
210-1
5的位置為0,最長子串從0開始到5,長度為6。
上面這兩個例子,所求的子串都是從頭開始,如果不是從頭開始,會是什麼樣的呢?看這個例子:110110001
2345
6121
2321
通過觀察上面的**,我們可以得到,dp[0]==dp[6]==dp[2],dp[1]==dp[3]. 根據dp的定義,如果dp[i]==dp[j],i 一種方法,我們用map儲存dp的值到位置的對映,如下表:
dp值位置
最大位置
最小位置
最大長度
10,2,660
621,3312
3444
0最長子串長度6
我們最終的演算法,要綜合考慮最長串是否從頭開始的。 上面的這個思路,時間複雜度是o(n),空間複雜度也是o(n).具體**如下:
struct node//儲存hash表中的最大最小位置
};void insetintohashmap(map& hashmap,int key,int index)//把」和「及位置插入hash表中
else//修改該和的最大最小位置 }
vectorlongsubseq(vector& data)
} res.push_back(begin);//儲存開始和結束的位置
res.push_back(end);
return res;
}
如有問題,請指正,謝謝
待字閨中之巧妙排序分析
排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。分析 這個題目,儘管也是排序,但卻不能使用快速排序的方法。只有三個元素,如果時間複雜度仍舊是o nlogn 顯然不是最好的。那就可以使用線性的排序演算法,例如計數排序,可是題目中要求,不能夠對1,2,3進行統計個數。那該如何處理呢?請大家看...
待字閨中之巧妙排序分析
排序僅僅有1。2,3三個元素的陣列。不能統計1,2。3的個數。分析 這個題目,雖然也是排序,但卻不能使用高速排序的方法。僅僅有三個元素,假設時間複雜度仍舊是o nlogn 顯然不是最好的。那就行使用線性的排序演算法,比如計數排序。但是題目中要求,不可以對1,2,3進行統計個數。那該怎樣處理呢?請大家...
待字閨中之兄弟數字分析
給定乙個數x,他的兄弟數y定義為 是由x中的數字組合而成。而且y是大於x的數中最小的。比如,38276的兄弟數字為38627。給定x,求y。分析 這個題目當然有暴力的方法。列出全部的排列組合。然後然後找到大於x中,最小的y。即。找到兄弟數字。那有沒有更好的方法呢?不想對全部情況進行窮舉。就要想辦法,...