力扣- - 最短回文串(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算法)相关推荐

  1. [Leetcode][第214题][JAVA][最短回文串][KMP][RK]

    [问题描述][中等] [解答思路] 1. 字符串哈希 复杂度 class Solution {public String shortestPalindrome(String s) {int n = s ...

  2. leetcode214. 最短回文串(kmp)

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  3. Leetcode 214.最短回文串

    Time: 20190906 Type: Hard 题目描述 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: &qu ...

  4. python最短回文串_LeetCode-Python-214. 最短回文串

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  5. LeetCode 214. 最短回文串(字符串哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串. 找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aace ...

  6. leetcode 214. 最短回文串 解题报告

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  7. 美团/力扣(647)--回文字串

    美团/力扣(647)–回文字串 文章目录 美团/力扣(647)--回文字串 一.题目描述 二.分析 方法一:中心扩散 代码一: 方法二:DP 代码二: 一.题目描述 力扣: 美团: 兄弟们!刷题的重要 ...

  8. leetcode214. 最短回文串

    214. 最短回文串 难度困难114 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa& ...

  9. 214. 最短回文串

    214. 最短回文串 原始题目链接:https://leetcode.cn/problems/shortest-palindrome/ 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文 ...

最新文章

  1. 让你的VB6.0支持滚轮操作
  2. 阿里云发布飞天专有云敏捷版 支持Docker企业版
  3. 服务机器人---多传感器融合
  4. finally 90%
  5. chrome控制台如何把vw显示成px_【CSS】rem,em,px的区别和使用场景
  6. 取文字_玉镯取不出来了怎么办?教你6种最有效的方法
  7. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
  8. 「代码随想录」139.单词拆分【动态规划】【完全背包】力扣详解!
  9. 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
  10. 海康摄像头故障处理踩坑记录
  11. e480win7显卡驱动_e480安装了windows7显卡驱动装不上
  12. 通过爬虫爬取一些图片
  13. 通过dhcp被动识别指纹原理
  14. 深耕MySQL - 如何使用联合索引执行查询
  15. uni-app常见的生命周期
  16. 游戏客户端安全方案。
  17. 《iPad开发从入门到精通》——6.6节系统设置
  18. JAVA 18 拥有 9 个新特性,JDK18
  19. 2022年人工智能指数报告(附PDF下载)
  20. Arudino+L298N控制直流电机正反转

热门文章

  1. python 功能键ord_ord()函数以及Python中的示例
  2. python两个数相加时_怎么用python让两个小数相加
  3. 自动化测试和手工测试
  4. php开启curl扩展
  5. (7)Java数据结构--集合map,set,list详解
  6. 网站防止SQL注入方法
  7. YY提交招股书赴美上市:连续三季盈利(转)
  8. 多数据库支持的应用程序设计(来自深空老大)
  9. XML与JavaBean相互转换工具
  10. 牛客 - 收集纸片(最短哈密顿路径-状压dp)