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不是回文...