【算法题】KMP算法应用:往字符串str1后面添加字符变成str2
来源:互联网 发布:mysql int字段累加 编辑:程序博客网 时间:2024/06/05 20:15
2017/11/21
KMP字符串匹配的应用问题
KMP字符串匹配可参考上一篇博客。
问题描述:
给定一个字符串str1,只能往str1的后面添加字符变成str2。
要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头。
要求2:str2尽量短最终返回str2
思路
1、利用next数组,求出包含字符串str1最后一个字符的最大相同前缀后缀;
例如abracadabra,其最大的相同前后缀是abra,长度是4,
2、向str1尾部添加从最大相同前缀后开始到结尾的子串;
例如,abracadabra+cadabra,即从下标4开始的子串添加到str1末尾,即是所求的str2。
此次的next数组大小不再是str1的长度,而是长度+1,因为要包含最后一个字符。
代码
#include <iostream>#include <string>#include <vector>using namespace std;/*2017/11/18 KMP扩展问题1:给定一个字符串str1,只能往str1的后面添加字符变成str2。要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头。要求2:str2尽量短最终返回str2*/#if 0int getNext(string s){ vector<int>next(s.length() + 1); next[0] = -1; if (s.length() < 2) return -1; next[1] = 0; int cn = 0; int i = 2; while (i<=s.length()) { if (s[i - 1] == s[cn]) next[i++] = ++cn; else if (cn <= 0) next[i++] = 0; else cn = next[cn]; } return next[next.size()-1];}string HaveTwice(string s){ if (s.length() == 0) return ""; else if (s.length() == 1) return s + s; else if (s.length() == 2) { return s[0] == s[1] ? s + s.substr(1) : s + s; } return s + s.substr(getNext(s));}void main(){ string s1 = "123ab123"; cout << HaveTwice(s1) << endl; string s2 = "a"; cout << HaveTwice(s2) << endl; string s3 = "aa"; cout << HaveTwice(s3) << endl; string s4 = "ab"; cout << HaveTwice(s4) << endl; string s5 = "abcdabcd"; cout << HaveTwice(s5) << endl; string s6 = "abracadabra"; cout << HaveTwice(s6) << endl; system("pause");}#else#endif
结果截图
阅读全文
1 0
- 【算法题】KMP算法应用:往字符串str1后面添加字符变成str2
- 算法21:实现strstr(str1, str2)
- 字符串str1、str2,测试str2中字符是否都包含在str1中。例如:str1="abcdef",str2="aaaaccc",则返回true
- 给定字符串str1和str2,求str1中子串含有str2所有字符的最小子串长度
- 将字符串str2的前n个字符复制到字符数组str1中
- 将字符串str1复制为字符串str2
- 复制字符str1,保存到str2中
- mysql 中的字符串连接 CONCAT(str1,str2,...)
- 16-1.5 str1 str2字符串连接
- 复制字符串str1,保存到str2中
- 复制字符串str1,保存在str2中
- 判断字符串str1是否包含str2
- stract函数的实现 连接str2到str1的后面
- 编程题:有两个字符串str1和str2,写一个函数实现在str1中查找str2的初始位置,要求不区分大小写
- 给定两个字符串str1和str2,查找str2在str1中出现的位置
- KMP算法在字符串中的应用
- 从键盘上输入一个字符串并保存在str1中,并把str1中下表为偶数的字符保存到str2中
- 将字符串str1复制为字符串str2.(指针)
- UDP使用connect()
- AndroidStudio3.0升级gradle配置填坑
- Python列表推导式(List comprehension)
- 1.7 JAVA多线程编程——停止线程
- MySQL与MySQLI的异同点
- 【算法题】KMP算法应用:往字符串str1后面添加字符变成str2
- pat乙级真题:1027. 打印沙漏(20)
- 数据结构实验之图论三:判断可达性
- (三十二)ToolBar 与 SearchView
- 巩固与修炼(八)
- 同一张html页面点击出现弹出框
- git 协作开发常规操作
- 设计模式
- POJ3258 River Hopscotch(二分法求最大化最小值)