链接: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

ubstr(字符串,截取开始位置,截取长度) //返回截取的字

substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串

substr('Hello World',1,1) //返回结果为 'H'  *0和1都是表示截取的开始位置为第一个字符

substr('Hello World',2,4) //返回结果为 'ello'

substr('Hello World',-3,3)//返回结果为 'rld' *负数(-i)表示截取的开始位置为字符串右端向左数第i个字符

测试:

select substr('Hello World',-3,3) value from dual;

find函数的使用:

#include<iostream>
#include<cstring>
#include <string>
using namespace std;
string s;
string s1;
int main()
{
cin >> s;
cin >> s1;
cout << s.find(s1) << endl;
}

asdfghhjd

fgh

3

asd

sd

1

aaaa

bb

4294967295

本题题解:

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

kmp:

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1000010
char s[N];
int ne[N],a[N],b[N];
void get(int x)
{
ne[]=ne[]=;
int i,j;
for(i=;i<x;i++)
{
j=ne[i];
while(j&&s[i]!=s[j])
j=ne[j];
ne[i+]=(s[i]==s[j]?j+:);
}
}
int main()
{
int i,j,k,tot;
scanf("%s",s);
k=strlen(s);
get(k);
j=k;
tot=;
while(ne[j])
{
if(ne[j])
a[tot++]=ne[j];
j=ne[j];
}
for(i=k;i>=;i--)
{
b[i]++;
b[ne[i]]+=b[i];
}
for(i=;i<tot;i++)
{
if(b[a[i]]>=)
{
for(j=;j<a[i];j++)
printf("%c",s[j]);
printf("\n");
return ;
}
}
printf("Just a legend\n");
return ;
}

我的wa代码

 #include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int n,m;
char a[];
char c[];
char b[];
int nxt[];
void get_nxt(int *nxt,char *a,int l)
{
int i = ;
int j = -;
nxt[] = -;
while (i < l)
{
if (j == - || a[i] == a[j]) nxt[++i] = ++j;
else j = nxt[j];
}
}
bool kmp(char *b,char *a,int la,int lb)
{
int i, j;
i = ;
j = ;
while (i<la)
{ if (a[i] == b[j] || j == -) //进行两个字符串的匹配
{
i++;//匹配成功,往后继续匹配
j++;
}
else//匹配完成一次,代表出现了一次,记录下来
{
j = nxt[j];
}
if (j == lb)
{
return ;
}
}
return ;
}
int main()
{
int k = ;
int i;
cin >> a;
int n = strlen(a);
get_nxt(nxt,a,n);
int j=;
bool f = ;
int t = nxt[n];
int kk = nxt[n];
int p = ;
for (i = ; i <= n - ; i++)
c[j++] = a[i];
while (t)
{
if (a[kk - p - ] != a[n - ]) break;
for (j = ; j <= t - ; j++)
b[j] = a[j];
j = ;
m = t;
memset(nxt, , sizeof(nxt));
get_nxt(nxt, b, t);
f = kmp(b, c, n - * t, t);
if (f)
{
for (j = ; j <= t - ; j++)
cout << b[j];
break;
}
t--;
p++;
}
if (!f) cout << "Just a legend" << endl;
else cout << endl;
return ;
}

字符串的问题(substr,find用法)的更多相关文章

  1. js中substring和substr的用法

    js中substring和substr的用法 substring 方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引 参数    ...

  2. Oracle substr() instr() 用法

    转载:oracle中substr() instr() 用法 substr(字符串,截取开始位置,截取长度) = 返回截取的字符串instr(源字符串,目标字符串,起始字符串,匹配字符串) = 返回要截 ...

  3. substring和substr的用法

    substring 方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引 返回值是一个新的字符串,该字符串值包含 stringOb ...

  4. 【转】awk 里的substr函数用法举例

    awk 里的substr函数用法举例: 要截取的内容:2007-08-04 04:45:03.084 - SuccessfulTradeResult(status: 1, currencyPair: ...

  5. 字符串截取 及 substr 和 substring 的区别

    1..字符串截取 str.substr(0, 1) // 获取字符串第一个字符 str.substr(-1) // 获取字符串最后一个字符 str.charAt(str.length - 1) // ...

  6. php去掉字符串的最后一个字符附substr()的用法

    转自:http://www.jb51.net/article/26604.htm 今天项目中用到,去掉字符串中的最后一个字符 原字符串1,2,3,4,5,6, 去掉最后一个字符"," ...

  7. js中substring和substr的用法比较

    推荐使用substring 方法   stringObject.substring(start,stop)   stringObject.substr(start,length)   定义和用法 提取 ...

  8. js中substring和substr的用法 (转)

    1.substring 方法 定义和用法 substring 方法用于提取字符串中介于两个指定下标之间的字符. 语法 stringObject.substring(start,stop) 参数     ...

  9. 截取字符串一之substr

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. JS中substring与substr的用法

    substring方法用于提取字符串中介于两个指定下标之间的字符 substring(start,end) 开始和结束的位置,从零开始的索引javascript 参数 描述 start 必需.一个非负 ...

随机推荐

  1. 最大匹配算法 (Maximum Matching)

    之所以研究这个算法,是因为最近在研究NLP中文的分词,所谓分词就是将一个完整的句子,例如“计算语言学课程有意思”,分解成一些词组单元“计算语言学,课程,有,意思”. “最大匹配法” 在中文分词中有所应 ...

  2. CentOS 7常用工具安装

    git 在Linux下开发项目,少不了要使用git工具,安装方法十分简单,通过一条 yum 指令既可完成安装: yum install git 安装完成后检测版本: # git --version g ...

  3. 2017~ROS暑期学校~分享

    http://www.robotics.sei.ecnu.edu.cn/ROS2017/ ---- 往年暑期学校活动:2015年,2016年 报名开始时间7月2日晚10点:暑期学校报名,机器人挑战赛报 ...

  4. Android深入理解JNI(二)类型转换、方法签名和JNIEnv

    相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换.方法签名和JNIEnv. 1.数据类型的转换 首先给出上一篇文章 ...

  5. IOS开发 清空数组正确方法

    NSArray以及NSMutableArray 在Objc中的两种数组(不可变数组和可变数组), 在日常开发中,经常会遇到需要清空数组的情况,很多人下意识的会想到nil这个方法,这里是不提倡的.因为如 ...

  6. c语言输出4*5的数列?

    1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20   输出上面的数列,用c实现的代码:<pre lang="c" line=&quo ...

  7. CentOS7 firewalld设置端口

    Centos升级到7之后,发现无法使用iptables控制Linuxs的端口,google之后发现Centos 7使用firewalld代替了原来的iptables.下面记录如何使用firewalld ...

  8. 关于C++一些面试题目的总结

    众所周知,在找工作时笔试题目往往对C++有大量考察,现在我们总结一些C++中比较重要而且可能会考到的知识. 1.判断一下A,B,C,D四个表达式是否正确. int a = 4: A:a += (a + ...

  9. margin top 无效

    常出现两种情况: (一)margin-top失效 两个层box1和box2,box1具有浮动属性,box2没有,这时候设置box2的上边距margin-top没有效果. 解决办法: 1.box2增加f ...

  10. js 字符串和数组注意点

    var a="foo"; var b=[ "f","o","o"]; a[1]="o"; b[1]= ...