這裡先提前注意一下,子串和子串行是兩個不同的東西:
回文串是面試常常遇到的問題(雖然問題本身沒啥意義),本文就告訴你回文串問題的核心思想是什麼。
首先,明確一下什:回文串就是正著讀和反著讀都一樣的字串。
比如說字串aba
和abba
都是回文串,因為它們對稱,反過來還是和本身一樣。反之,字串abac
就不是回文串。
可以看到回文串的的長度可能是奇數,也可能是偶數,這就新增了回文串問題的難度,解決該類問題的核心是雙指標。下面就通過一道最長回文子串的問題來具體理解一下回文串問題:
下面,就來說一下如何使用雙指標。
尋找回文串的問題核心思想是:從中間開始向兩邊擴散來判斷回文串。對於最長回文子串,就是這個意思:
但是呢,我們剛才也說了,回文串的長度可能是奇數也可能是偶數,如果是for 0 <= i < len(s):
找到以 s[i] 為中心的回文串
更新答案
abba
這種情況,沒有乙個中心字元,上面的演算法就沒轍了。所以我們可以修改一下:
**實現for 0 <= i < len(s):
找到以 s[i] 為中心的回文串
找到以 s[i] 和 s[i+1] 為中心的回文串
更新答案
至此,這道最長回文子串的問題就解決了,時間複雜度 o(n^2),空間複雜度 o(1)。string palindrome(string &s, int left, int right)
// 返回以s[left]和s[right]為中心的最長回文串
return s.substr(left + 1, right - left - 1);
}string longestpalindrome(string s)
return ans;
}
值得一提的是,這個問題可以用動態規劃方法解決,時間複雜度一樣,但是空間複雜度至少要 o(n^2) 來儲存 dp table。這道題是少有的動態規劃非最優解法的問題。
最長回文子串 最長回文子串行
1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...
最長回文子串
描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...
最長回文子串
輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...