力扣- - 最短回文串(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算法)相关推荐
- [Leetcode][第214题][JAVA][最短回文串][KMP][RK]
[问题描述][中等] [解答思路] 1. 字符串哈希 复杂度 class Solution {public String shortestPalindrome(String s) {int n = s ...
- leetcode214. 最短回文串(kmp)
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- Leetcode 214.最短回文串
Time: 20190906 Type: Hard 题目描述 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: &qu ...
- python最短回文串_LeetCode-Python-214. 最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- LeetCode 214. 最短回文串(字符串哈希)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串. 找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aace ...
- leetcode 214. 最短回文串 解题报告
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- 美团/力扣(647)--回文字串
美团/力扣(647)–回文字串 文章目录 美团/力扣(647)--回文字串 一.题目描述 二.分析 方法一:中心扩散 代码一: 方法二:DP 代码二: 一.题目描述 力扣: 美团: 兄弟们!刷题的重要 ...
- leetcode214. 最短回文串
214. 最短回文串 难度困难114 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa& ...
- 214. 最短回文串
214. 最短回文串 原始题目链接:https://leetcode.cn/problems/shortest-palindrome/ 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文 ...
最新文章
- 让你的VB6.0支持滚轮操作
- 阿里云发布飞天专有云敏捷版 支持Docker企业版
- 服务机器人---多传感器融合
- finally 90%
- chrome控制台如何把vw显示成px_【CSS】rem,em,px的区别和使用场景
- 取文字_玉镯取不出来了怎么办?教你6种最有效的方法
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
- 「代码随想录」139.单词拆分【动态规划】【完全背包】力扣详解!
- 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
- 海康摄像头故障处理踩坑记录
- e480win7显卡驱动_e480安装了windows7显卡驱动装不上
- 通过爬虫爬取一些图片
- 通过dhcp被动识别指纹原理
- 深耕MySQL - 如何使用联合索引执行查询
- uni-app常见的生命周期
- 游戏客户端安全方案。
- 《iPad开发从入门到精通》——6.6节系统设置
- JAVA 18 拥有 9 个新特性,JDK18
- 2022年人工智能指数报告(附PDF下载)
- Arudino+L298N控制直流电机正反转