怎么判断一个字符串的最长回文子串是否在头尾_LeetCode5:最长回文子串
最長回文子串問題是一個比較經典的題目,且字符串的處理問題也比較重要,這里實現了幾種可行的方法,寫了ac的表示可以通過,有的是可運行但是會超時或者是超過內存限制。
一:優化的暴力和暴力解
1.1 算是優化后的暴力解【AC】
其實我感覺這個解法和最長公共子串的復雜度應該是差不多吧,反正時間復雜度也很高就是了,險險的AC。。
拿到這個題的時候,我腦子里想的是,可以試試我的左右指針了,然后就出現了下面的代碼,雖然wa了好幾次,但是最后修修補補邊界條件最終還是過了,雖然耗時比較久。。。不過在判斷的條件上花了些心思,這樣的話可以避免存儲的問題,也避免了一些無效的字串,算是對爆破的時間復雜度優化了一點吧。大致思路如下:
第一層循環固定第一個值,然后第二個指針從后往前走,先找到和第一個指針的值相等的下標,并且記錄這個下標R,從這個下標開始比較,判斷是否存在回文串,如果不存在,那么就從下標R-1開始繼續上述的過程。
整個題目出錯的點,都寫在注釋里了,邊界條件總是會搞不準,而且flag的設置一開始定位不準確,都是一開始的思路不是很清楚導致的,比較關鍵的一個錯誤是,if條件判斷不準確,導致下標發生了錯誤,再就是在一次字串判斷失敗以后,應該讓左指針恢復原來的i,否則會導致漏掉一些字串。
string1.2 暴力解
下面的解決方法是最直接的暴力,會超出內存限制,應該是存reverse的時候超出了內存限制;【但我比較奇怪的是,不是有方法是最長公共子串嗎,這不是要把每一個字符串都reverse嗎,那這種方法理論上也會超出內存??】
我嘗試了一個一個的判斷,這樣的話時間復雜度也會上來,最后也超出了時間限制,所以單純的爆破在這里應該是不可以AC的。。
// 第一種暴力二、最長公共子序列
對字符串逆序,然后找到最長公共子串,還需要判斷這個公共子串是否是回文數。比較悲傷的是,這個還是會超時。
class三、中心擴展法【AC】
這個方法其實比較好理解,就是回文串一定是一個對稱的存在,所以可以從對稱中心出發,去尋找以當前中心出發的回文串的大小,然后挨個比較就可以了。
我這個出錯的點在于,已知字符串的長度和中心點的下標,如何求出來字符串的起始位置?但其實也可以直接讓函數返回一個字符串就沒有這種煩惱了,第二種就是這樣寫的,時間上還快了很多。
class第二種返回字符串的方法
class四、動態規劃
搓手手,要動態規劃了,嚶嚶嚶。對這個算法有著一些些的畏懼心理,數據結構小老頭講的太無趣,并且成功錯過了高神的動歸課,當然這都不是理由,重點是。。。懶于思考的我,活該菜狗。【好吧,其實寫這個的時候,感覺還是沒有理解透徹什么是動態規劃,,等我好好學習一下左神的視頻以后,理解的更深刻了再來更新好了!】
class總結
以上是生活随笔為你收集整理的怎么判断一个字符串的最长回文子串是否在头尾_LeetCode5:最长回文子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1803无法升级到2004_今年的Win
- 下一篇: clickhouse原理解析与开发实战