力扣- - 最短回文串(KMP算法)
生活随笔
收集整理的這篇文章主要介紹了
力扣- - 最短回文串(KMP算法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
力扣- - 最短回文串(KMP算法)
文章目錄
- 力扣- - 最短回文串(KMP算法)
- 一、題目描述
- 二、分析之KMP算法
- 1.暴力法
- 2.KMP算法
- 3.next數組求法1:暴力查找最長的前后綴
- 4.next數組求法2
- 5.完整KMP代碼
- 三、題目分析
- 四、代碼
一、題目描述
二、分析之KMP算法
1.暴力法
2.KMP算法
3.next數組求法1:暴力查找最長的前后綴
4.next數組求法2
5.完整KMP代碼
三、題目分析
- 讓我們回到這道題本身,我們可以把題目給定的字符串 s 反轉過來,得到 reverse 字符串
- 然后在 s 和reverse之間加上一個 # 字符作為分割,拼成一個新的pattern字符串
- 然后用KMP中計算pattern最長前后綴的方法,得到pattern的最長公共前后綴ABA
- 然后把reverse放在前面,s放在后面,刪掉中間重復的一組ABA,就得到結果了
- 因為我們需要得到的只是pattern的next數組中的最后一個值,所以commpute_next只需要返回最后一個值就可以了
四、代碼
class Solution { public:int commpute_next(string pattern){vector<int>next(pattern.size() + 1, 0);next[0] = -1;next[1] = 0; // A沒有前后綴int i = 2; // i表示next數組的索引int k = 0;while (i < next.size()) {// pattern索引比next索引小1if (pattern[i - 1] == pattern[k]) { next[i] = k + 1;k = next[i];++i;} else if (k == 0){next[i] = 0;++i;} else{k = next[k];}}return next[next.size() - 1];}string shortestPalindrome(string s) {if(s == ""){return "";}string reverse = "";for (int i = s.size() - 1; i >= 0; --i) {reverse += s[i];}string pattern = s + '#' + reverse;int max_len = commpute_next(pattern);return reverse.substr(0, reverse.size() - max_len) + s;} };總結
以上是生活随笔為你收集整理的力扣- - 最短回文串(KMP算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣- -阶乘函数后K个零
- 下一篇: 力扣--让字符串成为回文串的最少插入次数