日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

力扣- - 最短回文串(KMP算法)

發布時間:2024/4/11 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 力扣- - 最短回文串(KMP算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

力扣- - 最短回文串(KMP算法)

文章目錄

  • 力扣- - 最短回文串(KMP算法)
    • 一、題目描述
    • 二、分析之KMP算法
      • 1.暴力法
      • 2.KMP算法
      • 3.next數組求法1:暴力查找最長的前后綴
      • 4.next數組求法2
      • 5.完整KMP代碼
    • 三、題目分析
    • 四、代碼

一、題目描述

二、分析之KMP算法

1.暴力法








































2.KMP算法























3.next數組求法1:暴力查找最長的前后綴








vector<int> commpute_next(string pattern){vector<int>next(pattern.size() + 1, 0);next[0] = -1;for (int i = 2; i < next.size(); ++i) {for (int j = 1; j < i; ++j) {if (pattern.substr(0, j) == pattern.substr(i - j, j)) {next[i] = j;}}}return next;}int kmp(string str,string pattern){vector<int> next = commpute_next(pattern);int i = 0;int j = 0;while (i < str.size()) {if (str[i] != pattern[j]) {j = next[j];//表示當前沒有已匹配字符if (j == -1) { i++; //尋找下一個匹配的pattern首字母j = 0; //指針移到pattern開頭}}else{i++;j++;if (j == pattern.size()) {return (int) (i - pattern.size());}}}return -1;}

4.next數組求法2
















#include <iostream> #include <string> #include <vector> using namespace std;vector<int> GetNext(string& match) {vector<int> next(match.size() + 1,0);next[0] = -1;int i = 2;int k = 0;while(i < match.size()){if(match[i - 1] == match[k]){next[i] = k + 1;k = next[i];i++;}else if(k == 0){next[i] = 0;i++;}else {k = next[k];}}return next; }int main() {string str;string match;while(getline(cin,str)){getline(cin,match);vector<int> next = GetNext(match);int flag = 1;int i = 0;int j = 0;while(i < str.size()){if(str[i] == match[j]){i++;j++;if(j == match.size()){flag = 0;cout<<i - match.size()<<" ";j = next[j];}}else{j = next[j];if(j == -1){j = 0;i++;}}}if(flag)cout<<-1<<endl;}return 0; }

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算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。