阿里筆試2:求最長非遞減字符長度

首先這個題目我自己是做錯了的,最後AC是0.1,和沒有一樣(香菇…),但是思路上是對的,只是這應該是個動態規劃問題,我做成了BFS的問題了。

動態規劃

題意
首先定義非遞減字符串,然後給n個非遞減字符串,選擇任意個拼起來,問能拼出來的最長非遞減字符串長度

這個題目我們的關鍵點就在於怎麼去存儲每個非遞減字符串,然後接下來的問題就死如何去拼接這些字符串。首先說一下存儲的問題

存儲字符串

存儲字符串我們使用的是一個二維的dp數組,數組大小爲dp[26][26],相信看到大小能知道每個元素代表什麼了,沒錯dp[i][j]就是代表的字母a+i到和字母a+j之間有多少個字符。假如我們現在有一個字符串"fhik",那麼對應於我們dp數組中就是dp[5][10]=4,表明目前爲止給出的字符串中,在字母fk中包含有4個字符。爲什麼是目前爲止,因爲假設我們還有一個字符串"fghik",那麼我們是需要更新此處的值變爲dp[5][10] = Math.max(dp[5][10], "fghik".length()),表示因爲有別的字符串,所以這中間的長度是變大了。這個地方要注意的是,前面的字符串"fhik"其實就沒有記住它的必要了,因爲但凡我們需要區間[f, k]內的長度,都是取此區間內那個較大的

當然還有一個地方要注意的是,如果是一串相同的字符組成的字符串例如"dddd",那麼對應的數組元素應該是dp[3][3] = 4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章