遞迴求解最短回文串的一些個人理解

2021-10-04 04:32:59 字數 1163 閱讀 9802

遞迴這裡,最令我疑惑的便是為什麼一旦j與i指向的值相等,就要加1。為此,需要先明確我們的目標——找到從0開始的最長回文串。

想找乙個範圍在[0,i)上的最長回文串,當j從n-1向前遍歷時,顯然只有在j指向的值與0處相等時,才有可能出現回文串。

那麼,另外乙個問題?為什麼i要在這之後加1?並且一旦又碰到i與j指向值相等,i就要繼續自加?

這是因為,當j指向的值與i指向的值相等時,那麼就意味著從0到i的所有值,與從j反推回相應數目的值,有可能會形成回文串

因為這裡,我們只比較了第i個值和j指向的值,而沒有去比較i以前的值與j之後的值是否相等。

如果i與j此刻的值相等,那麼我們就可以猜測0到i的值和j及其後對應數目的值有可能相等。所以i加1,判斷之後的值與j下一次指向的值時否相等

一旦出現不相等,那麼可以確定,j之後的值沒有機會加入進我們的目標串了。

j從n-1一直迭代到0,中間一定會和i相遇,之後的情況就是j指向前面的值,i指向後面的值。

這裡還是和之前的理解一樣,如果出現了i指向的值與j指向的值相等,那麼可以假設j之前的值與i之後對應數目的值相等。

相等i就會被繼續往字串尾部趕,不相等i就停止不動了。一次遞迴下來,可以把i趕出最長字串可能存在的區間範圍內。

所以把i之後的反向值加到頭部,正向值加到尾部,並把此時[0,i)的子串繼續送進去遞迴

附上源**:

#include

#include

#include

using

namespace std;

string shortestpalindrome

(string s)

if(i==n)

return s;

string remain_rev = s.

substr

(i);

reverse

(remain_rev.

begin()

, remain_rev.

end())

;return remain_rev +

shortestpalindrome

(s.substr(0

,i))

+ s.

substr

(i);

}int

main()

參考:

遞迴演算法 一些個人理解

遞迴演算法,從定義上來說,是一種直接或者間接地呼叫自身的一種演算法,這裡的自己可以是函式或者方法。遞迴演算法的思想或者說實質就是把實際的問題分解成規模較小的乙個個的子問題,然後不斷使用遞迴呼叫方法來求得問題的解。要學習和使用遞迴演算法,就要從最基本的定義上來先解讀。遞迴演算法是把問題轉化為規模縮小了...

一些個人的想法

今天是2016年4月2日,星期六。目前我已經在網際網路行業裡摸爬滾打了三年有餘,加上七年的求學生涯,轉眼一看已經十年了。過去的十年是網際網路行業蓬勃發展的十年,雲計算 資料探勘以及移動網際網路的興起讓我們的生活出現了翻天覆地的變化 在這個遍地充滿機會的時代裡,出現了乙個又乙個的弄潮兒 這是乙個最好的...

PDV的一些個人理解

最近剛剛考完sas base,對這個考試的一大感受就是,只要你理解了pdv,基本上就不成問題。接下來談談我對pdv的理解吧,也算是學習sas的過程中的乙個筆記。sas的執行有兩個階段需要了解,編譯階段 compilation phase 和執行階段 execution phase 編譯階段sas主要...