首先這個題目我自己是做錯了的,最後AC是0.1,和沒有一樣(香菇…),但是思路上是對的,只是這應該是個動態規劃問題,我做成了BFS的問題了。
動態規劃
題意
首先定義非遞減字符串,然後給n個非遞減字符串,選擇任意個拼起來,問能拼出來的最長非遞減字符串長度
這個題目我們的關鍵點就在於怎麼去存儲每個非遞減字符串,然後接下來的問題就死如何去拼接這些字符串。首先說一下存儲的問題
存儲字符串
存儲字符串我們使用的是一個二維的dp數組,數組大小爲dp[26][26]
,相信看到大小能知道每個元素代表什麼了,沒錯dp[i][j]
就是代表的字母a+i
到和字母a+j
之間有多少個字符。假如我們現在有一個字符串"fhik"
,那麼對應於我們dp數組中就是dp[5][10]=4
,表明目前爲止給出的字符串中,在字母f
到k
中包含有4個字符。爲什麼是目前爲止,因爲假設我們還有一個字符串"fghik"
,那麼我們是需要更新此處的值變爲dp[5][10] = Math.max(dp[5][10], "fghik".length())
,表示因爲有別的字符串,所以這中間的長度是變大了。這個地方要注意的是,前面的字符串"fhik"
其實就沒有記住它的必要了,因爲但凡我們需要區間[f, k]
內的長度,都是取此區間內那個較大的。
當然還有一個地方要注意的是,如果是一串相同的字符組成的字符串例如"dddd"
,那麼對應的數組元素應該是dp[3][3] = 4
。