【算法题】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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 摩托罗拉移动电话通话没声音怎么办 摩托罗拉对讲机充电座坏了怎么办 手机导航键太灵敏怎么办 经侦大队不立案怎么办 槐茂酱菜太咸怎么办 法院执法局执法不公怎么办 搞养殖卖不出去怎么办 孔雀吃了蚯蚓该怎么办 多肉幼苗长徒了怎么办 小鸵鸟嘴断了怎么办 武汉早谢怎么办博大直上 威猛先生伤手了怎么办 嗓子眼边条线下边长块肉怎么办 线长在肉里怎么办 北京买车没有号怎么办 租的车处理违章怎么办 以租代购车不要怎么办 订车的合同掉了怎么办 买车合同丢了怎么办 车的证件都丢了怎么办 桃树直立的徒长枝怎么办 月季花长了独枝怎么办? 6岁半B超没子宫怎么办 学生学籍号和身份证号不一致怎么办 学生学籍号和身份证号不一样怎么办 领导交代的任务完不成怎么办 洗衣机里的衣服有味道怎么办 新买的洗衣机有味道怎么办 模拟工业装置没有数据验证怎么办 民办学校的指标生学费怎么办 孩子上初中后成绩不好怎么办 孩子考最后一名怎么办 数学大题不会做怎么办 小学六年级数学考30分怎么办 六年级数学考了30分怎么办 数学考了30分怎么办 没有给直接领导报到怎么办 小学二年级成绩不好怎么办 初中孩子上课注意力不集中怎么办 学生打架家长争吵老师怎么办 我和我老婆感情危机怎么办