回文字串判斷c語言 動態規劃 最長回文字串

2021-10-11 22:58:52 字數 2074 閱讀 9301

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。

示例1:

輸入: "babad"

輸出: "bab"

注意: "aba"也是一-個有效答案。

示例2:

輸入: "cbbd"

輸出: "bb"

這是一道非常經典的動態規劃的題目,我是在回顧演算法題的時候看到這一題,我記得我以前做過,但是理解不深,所以當時我怎麼想都想不出來,於是乎看了看官方題解,然後寫下本篇文章。

思路:官網上的p[i][j]啊啥的我就不說了,我使用大白話讓你理解,比如現有乙個字串為"dcabace",現不用程式去跑,肉眼觀察,你掃瞄一圈,發現了aba是回文字串,接下來你一定是從aba開始,看到這個是最小回文字串,然後擴大,看看c是不是在"aba"兩端都有,如果有,那麼這個回文字串就大了一圈,現在順著這個思路,如果你能在程式中知道最小回文字串,是不是就可以慢慢擴大範圍找出更大的呢? 答案是肯定的!

找出長度為3的最小回文字串**如下:

思路:當遇到兩個相同字元時,檢視這兩個字元位置下標差是否小於3,如果是,則返回。

public static string longestpalindrome(string s) 

}} return str;

}

在我找到最小回文串之後,我擴大一圈,檢視更大的回文串的時候,這個時候我就慌了,我腦子能記住剛剛擴容之前的那個字串,可是程式記不住啊,所以我們需要乙個flag,來標記上乙個字串所在位置,為回文字串,這個時候我判斷結束之後,我就去檢視我上乙個位置是不是回文,如果是,我就可以擴容,如果不是,則不擴容。

public static string longestpalindrome(string s) 

} }return str;

}

理解這個flag陣列是不容易的,畫圖演示:

當我們的字串是 "dcabac" 這樣的,遍歷的時候i到了最後的位置,j從頭開始遍歷,當j在0號位置的時候,不成立,j++。

此時到達這個位置(如下圖所示),我們人為思考知道這乙個就是最大回文串,而且這段**確實是判斷出來了,為什麼呢?

核心**

flag[j] = (s.charat(i) == s.charat(j)) && (i - j < 3 || flag[j + 1]);
顯而易見,這個flag[j] 程式一定是判斷為true,才可能會輸出這個字串,那麼為什麼是true? 看第乙個條件

(s.charat(i) == s.charat(j))
沒錯,這個是true,然後看下一句

(i - j < 3 || flag[j + 1])
i - j < 3 顯然為false,斷定 flag[j + 1] 一定為true,問題就在這裡,flag[j + 1]是什麼,它為什麼是true?

我畫圖演示,行代表這個boolean陣列的取值,列代表 i 迴圈次數。

第五次後面五個全是t的原因為第四次後面三個是t,flag[j + 1]為true,i = 5此次迴圈,當 j = 1 時,雖然這兩個元素相等,但是之間距離大於3,但是!!flag[j + 1] 為true,所以驗證成功,因為flag[j + 1] 在上一次我們就已經驗證過它是回文串了。照這個思想繼續下去,我們每驗證到有兩個字元相同,就去找它下乙個下標,是否曾經判斷過為回文串,是的話,擴容,以此迴圈,就可以找出最大回文字串,可能你會問,不是應該用二維數組裝嗎?你可以debug試一試,flag這個陣列他後面的值不會被替換,j+1還是能訪問到,也就是說,你這一次進迴圈還是可以訪問到上一次的值,以此達到判斷上乙個串的效果,至此,解答結束。

謝謝!

動態規劃 最長回文字串

題目 請從乙個已知的字串中尋找最長回文字串 解法1 動態規劃 回文字串的子串也是回文,比如p i,j 表示以i開始以j結束的子串 是回文字串,那麼p i 1,j 1 也是回文字串。這樣最長回文子串就能分解成一系列子問題了。這樣需要額外的空間o n 2 演算法複雜度也是o n 2 狀態方程和轉移方程 ...

動態規劃(5) 最長回文字串

給出乙個字串s,求s 的最長回文子串 連續 的長度。輸入 patzjujztaccbcc 輸出 9 最優子結構 如atzjujzta是回文子串,那麼它字串tzjujzt一定是回文子串,且長度等於tzjujzt的長度 2 重複子問題 如求atzjujzta和tzjujzt的長度,都會用到juj的長度 ...

最長回文串 動態規劃)

半對 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路一 翻轉字串法。1.將整個字串反轉,然後判斷原始的字串是否在反轉的字串 現。2.只是出現還不...