刷leetcode一直沒做到大名鼎鼎的LCS問題,也不明白LCS具體是什麼問題,直到做到去年騰訊筆試的一道編程題:
給定一個字符串s,你可以從中刪除一些字符,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?
輸出需要刪除的字符個數。
輸入描述:
輸入數據有多組,每組包含一個字符串s,且保證:1<=s.length<=1000.
輸出描述:
對於每組數據,輸出一個整數,代表最少需要刪除的字符個數。
輸入例子:
abcda google
輸出例子:
2
2
最初毫無頭緒,還想着能不能通過思考解最長迴文串的解法來解答,後來實在無果,借鑑網上的解答,發現可以使用字符串反轉然後求LCS問題來輕鬆解答。於是寫下這篇博文,也算是爲自己了了LCS問題這個坑。
"
這道題可以通過動態規劃來做。
首先初始化一個二維數組lcs[][],各元素均爲0;
現在對這個數組進行狀態及遞推的判斷,i,j分別從0開始,雙層循環。
如果str1[i]==str[j]則lcs[i][j]=lcs[i-1][j-1]+1;
如果str1[i]!=str[j],那麼lcs[i][j]=max(lcs[i][j-1],lcs[i-1][j]) /*這句話必須理解,這是算法的關鍵,可以結果棋盤圖去思考
有了這個遞推關係,解答就很簡單了·~~~~