214最短回文串(KMP演算法 困難)

2021-10-07 04:15:08 字數 894 閱讀 2643

1、題目描述

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。

2、示例

輸入: "aacecaaa"

輸出: "aaacecaaa"

3、題解

問題可以簡化為從s的開頭尋找最大的回文子串,然後將剩下的後面部分翻轉後接到s的前面。例如對於字串aacecaaba,從開頭找到的最大的回文子串是aacecaa,剩下部分是ba翻轉得ab,拼接到s的前面得abaacecaaba。

對於s=aacecaaba翻轉後得s_reverse=abaacecaa那麼兩個字串拼接s_reverse+s一定是回文串,但不一定是最短的回文串,要想得到最短的回文串,只需要將s的字首和s_reverse的字尾最大重複部分(即aacecaa)合併就得到最短回文串。

這就聯想到kmp演算法中的next陣列,就是用來查詢乙個字串的字首和字尾相同的長度的最大值,因為查詢的是s的字首和s_reverse的字尾相同的部分,所以s+s_reverse拼接得到新串,然後求得新串的next陣列即可,但是我們所求的字首是不能超過中點的,因此用乙個特殊字元隔開。

最後將s_reverse與s非重複重複部分擷取拼接上s就是最短回文串結果。

#include#include#includeusing namespace std;

class solution

else

i = next[i];

} //將s_new的s_reverse的與s非重複重複部分擷取拼接上s就是最短回文串結果

return s_new.substr(s.size() + 1, s.size() - next[s_new.size()]) + s;

}};int main()

214 最短回文串

難度 困難 題目描述 思路總結 python字串反轉幾種方法 還是那句話,現階段注重的是數量,質量等後期提高。這題利用簡單的直覺做題,這種思路還需要再積累。沒見過這種題是很難想出來的。題解一 class solution def shortestpalindrome self,s str str 思...

214 最短回文串

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。示例 1 輸入 aacecaaa 輸出 aaacecaaa 示例 2 輸入 abcd 輸出 dcbabcd 這個題目可以轉化成找出該字串的最長回文字首。class solution for in...

C LeetCode 214 最短回文串

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。示例 1 輸入 aacecaaa 輸出 aaacecaaa 示例 2 輸入 abcd 輸出 dcbabcd 這題考慮把字串s分成s1和s2兩部分,即s s1 s2,其中s1為回文串,s2不是回文...