链接:https://www.nowcoder.com/acm/contest/77/C
来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

有一个字符串 让你找到这个字符串 S 里面的子串T 这个子串 T 必须满足即使这个串的前缀 也是这个
串的后缀 并且 在字符串中也出现过一次的(提示 要求满足前后缀的同时也要在字符串中出现一次 只是前后缀可不行 输出最长满足要求字符串)

输入描述:

给出一个字符串 长度 1 到 1e6  全部是小写字母

输出描述:

如果找的到就输出这个子串T 如果不行就输出 Just a legend

输入例子:
fixprefixsuffix
输出例子:
fix

-->

示例1

输入

fixprefixsuffix

输出

fix
示例2

输入

abcdabc

输出

Just a legend
方法一:kmp:注意枚举的模式串,以及原串与给定字符之间的差别:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
string str, mo;
int Next[1000005]; void getNext(){
Next[0] = -1; //一定要初始化
int i = 0, j = -1, len = mo.length();
while(i < len){
if(j == -1 || mo[i] == mo[j]) //j表示前i-1个字符中前缀和后缀相等的长度
Next[++i] = ++j; //如果跳转的值相同,则Next的下一位对应的为前一位加一
else
j = Next[j]; //j回溯
}
} int kmp(){
int ans = 0;
int i = 0, j = 0, l1 = str.length(), l2 = mo.length();
while(i < l1){
if(j == -1 || str[i] == mo[j])
i++, j++;
else
j = Next[j]; //只需回溯j
if(j == l2) //在原串中找到一个模式串
ans++;
}
return ans;
} int main(){
ios::sync_with_stdio(false); //取消cin 与 scanf()同步,刚刚没加超时了
string tt;
cin >> tt;
int len = tt.length(), flag = 1;
for(int i = len - 2, j; i >= 1; i--){ //枚举所以可能的前缀长度,注意不是范围不是0~len/2,要保证中间子串不用前缀后缀重合即可
string s;
for(j = 0; j < i; j++){ //判断是否与后缀相等
if(tt[j] != tt[len - i + j]){
break;
}
s += tt[j];
}
if(j == i){
mo = s; //将前缀作为模式串
getNext();
// str = tt;
for(int k = 1; k < len - 1; k++) //中间不与前缀后缀重合的子串作为原串,注意范围!!!
str += tt[k];
int ct = kmp();
if(ct >= 1){ //在原串中找到即可
cout << s << endl;
flag = 0;
break;
}
str.clear();
}
}
if(flag){
cout << "Just a legend" << endl;
}
return 0;
}
/*
aaaaa
结果:
aaa
*/

  

  第二次写:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int Next[1000005]; void getNext(string p){
int j = 0, k = -1, len = p.length();
Next[0] = -1;
while(j < len){
if(k == -1 || p[j] == p[k]){
/*
Next[++j] = ++k; //换成下面的if和else */
if(p[++j] == p[++k]){
Next[j] = Next[k];
}
else{
Next[j] = k;
}
}
else{
k = Next[k];
}
}
} int main()
{
string str, p, pp;
cin >> str;
int len = str.length();
int ct = 0, k = 1; while(k < len - 1){
p = str.substr(0, k);
pp = str.substr(len - k, k);
if(p != pp){
k++;
continue;
}
getNext(p);
int count = 0, i = 0, j = 0;
while(i < len){
if(j == -1 || str[i] == p[j]){
j++, i++;
}
else{
j = Next[j];
}
if(j == k){
count++;
j = 0; i = i - k + 1;
if(count >= 3){
ct = k;
break;
}
}
}
k++;
}
if(ct == 0){
cout << "Just a legend" << endl;
}
else{
cout << str.substr(0, ct) << endl;
}
return 0;
}

  

方法二:用substr,find:

  

#include<iostream>
#include<cstring>
#include <string>
using namespace std;
string s; int main(){
cin >> s;
int k = 1, l = s.size();
string ans = "";
while (l>2 && k<l){
string ss = s.substr(0, k);//拷贝s第0个数开始,长度为k
if (s.substr(l - k, k) == ss)
{
string sss = s.substr(1, l - 2);
///cout << sss.find(ss) << endl;
if (sss.find(ss)<l - 2)
ans = ss;
}
k++;
}
if (ans == "")
cout << "Just a legend" << endl;
else
cout << ans << endl;
}

  


19-字符串匹配(kmp || substr,find)的更多相关文章

  1. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  2. 字符串匹配-KMP

    节选自 https://www.cnblogs.com/zhangtianq/p/5839909.html 字符串匹配 KMP O(m+n) O原来的暴力算法 当不匹配的时候 尽管之前文本串和模式串已 ...

  3. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  4. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  5. 字符串匹配KMP算法

    1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP

  6. 字符串匹配KMP算法的C语言实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  7. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  8. 字符串匹配KMP算法(转自阮一峰)

    转自 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...

  9. 【Foreign】字符串匹配 [KMP]

    字符串匹配 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 3 3 6 3 1 2 1 2 ...

  10. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

随机推荐

  1. HDU - 6178:Monkeys (贪心&树上最大匹配输&输入优化)

    There is a tree having N vertices. In the tree there are K monkeys (K <= N). A vertex can be occu ...

  2. Redis常见面试题总结

    Redis面试题总结(1) 2018年02月28日 17:42:21 LSX丨笔头先生 阅读数:3568更多 个人分类: 面试题总结   (1)什么是redis? Redis 是一个基于内存的高性能k ...

  3. vc++ windows 开始菜单添加快捷方式

    开始菜单创建快捷方式 在windows软件开发中,软件安装过程中总是需要在开始菜单创建快捷方式,下面介绍一种开始菜单创建快捷方式的方法,具体代码如下: /* * 创建快捷方式 * szExePath[ ...

  4. win10 svn server安装过程中到starting service时失败

    当安装到Start Service阶段后,将会出错并会弹出一个对话框,提示是否要retry. (此时SVN服务软件已经安装完毕,仅仅是无法通过证书验证,无法启动服务),如果此时选择对话框中的cance ...

  5. css处理最后一个li

    .relatebar li{width:98px;height:146px;padding:5px;float:left;border-left:1px solid #ccc;} .relatebar ...

  6. js客户端UI框架

    Best jQuery UI http://b-jui.com/ jQuery EasyUI http://www.jeasyui.com/ bootstrap学习网: http://www.runo ...

  7. World、Excel利用流下载

    /** * 下载excel * @param request * @param response * @param filePath * @param fileName */public static ...

  8. Aes加密算法加密模式介绍

    本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...

  9. 关于 webpack-dev-server 热更新出现重复的问题

    关于 webpack-dev-server 热更新出现重复的问题 webpack-dev-server 在前端开发时很方便,可以热更新,只需要配置 webpack.config.js 即可. 但是昨天 ...

  10. tensorflow学习笔记(三十九):双向rnn

    tensorflow 双向 rnn 如何在tensorflow中实现双向rnn 单层双向rnn 单层双向rnn (cs224d) tensorflow中已经提供了双向rnn的接口,它就是tf.nn.b ...