給定乙個字串str,可以在str的任意地方新增字元,請返回在新增字元最少的情況下,讓str整體都是回文字串的結果
分析:1)問題關鍵:如何以個例推整體,再由整體推回個例?
回文字串問題:顯然,當任意 [i… j]字串為回文字串時,其中的任意k使得[i+k…j-k] 同樣也是回文字串,這樣可以推出結論:先假設字串str[i…j]已經是回文字串,那麼不論是在前面或者後面再加乙個字元,此時我們最多隻需要再在另一頭再加上這個字元就使整體再次成為字串。(注:是否存在我單單只加乙個字元不改變回文結構的情況,例:最特殊的,原字串由同乙個字元組成,此時再加乙個該字元那肯定還是回文。)
2)由此可知,[i…j]最少新增幾個字元的問題,我們可以根據幾種情況去甩給子串。先分析,
① 當str[i] == str[j]時,問題直接交給[i+1…j-1],、
② 當str[i] != str[j] ,此時如何分析,?
1.頭尾不相等,那麼肯定頭尾有一端是最終回文字串的最外層的,是頭還是尾我不管,先得出這個結論(因為要新增最少字元,所以讓原本在最外層的還是呆在最外層肯定是最優方案之一)。
2.再來分析頭尾問題,頭尾至少有乙個會成為最終字串的最外層,那麼肯定是誰新增的少誰來當那個外面的。那麼此時問題就交給了 [i+1 … j] 以及 [i … j-1]這兩個子串。這倆哪個子串成為回文串的需求比較小,我就選哪個,然後最外層就相應新增另一頭的,(原字串i…j兩頭不相等,注定了要分開,必須為其中乙個重新分配合適物件,而且這個物件至少有乙個是外來的,才能牽手成功!然後另乙個暫時沒分配的我先扔到子串裡頭,看看有沒有合適的,沒有我在按上面的步驟來考慮.)
3.通過dp陣列來還原最終回文字串結果:
首先取值肯定取 dp[0][str.length],然後逐一分情況討論,
1)當 str[i] == str[j]時,還原出的回文串應當為:
str[i] + [i+1…j-1]上應該還原出來的回文串 + str[j]也就是str[i]2)當兩者不相等時,此時我們就需要分析,dp[i][j]上的值是從哪得到的,即dp[i+1][j] 和dp[i][j-1]的大小,當前者小時,dp值就從前者+1得到,那麼此時,我們的決策是為i位置上的字元分配物件,將j仍進子串中,那麼回文串通式為:
str[i]
+[i+1..
..j]這裡自己決策回文串 + str[i]
**實現:
//首先實現獲取dp陣列部分
public
int[
]getdp
(string str)
//這裡開始填寫**中的j往前部分
for(
int i = j -
2; i >-1
; i--
)else}}
return dp;
}//這裡是總實現**
public string main1
(string str)
//特殊情況咱先過了
int[
] dp =
getdp
(str)
;int i =0;
int j = str.
length()
;char
res =
newchar
[str.
length()
+ dp[0]
[str.
length()
]];int resl =0;
int resr = res.length;
while
(i <= j)
else
if(dp[i]
[j-1
]< dp[i+1]
[j])
else
resl++
; resr++;}
return string.
valueof
(res);}
}
總結:
本題涉及到動態規劃思想,每段字串是否為回文的判斷都交給了切割兩端字元後的子串去解決,語言上比較好描述,但是我沒能想出具體**實現方法,最後研究**實現過程仍然是十分簡潔,getdp中的內for迴圈還是很容易想到,只是我一直糾結於任取乙個0,j最終會交給 (j+0) >> 1 處的dp值來處理,剛開始一直糾結於這個地方是否可能還沒有賦值,實際上這不存在。只要動筆隨便嘩啦幾下就出來了,不能一直只用眼睛看。
字串1 字串的旋轉
題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前三個字元 a b c 移到字串的尾部,那麼原字串將變成 defabc 首先想到的是將需要移動的字元乙個乙個移到字串的尾部。實現如下 public class transfet s n 1 t publi...
字串(一) 字串Hash
今天開一手最不 tao 擅 yan 長的字串演算法 字串hash演算法。似乎提到字串的話,kmp應該是更為常見的一種,但是hash有它的優點,被犇們稱為 優雅的暴力 何謂hash?hash的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意...
18 字串 char型字串
1 什麼是字串?字串是以空字元 0 結尾的字元陣列。空字元的assii碼為 0,空格的ascii碼為32 2 0的作用 0 是乙個空字元標誌,它的assii碼為0,c 有好多處理字串的函式,都以 0 為結束標記。也就是以空字元為結束標記,比如cin,cout。它們都以空字元為結束標記,他們在遇到空字...