链接: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. windows 2008 server R2 服务器docker安装

    1.安装包选择 windows win10 较新版本,使用 Get Docker for Windows (Stable) 或者 Get Docker for Windows (Edge) 其余使用  ...

  2. PHP strip_tags() 函数的作用和用法

    strip_tags()函数可以轻松实现从字符串中去除 HTML 和 PHP 标记. 使用方法: trip_tags ( string $str [, string $allowable_tags ] ...

  3. pulltoRefresh类图

  4. c# DataTable导出为excel

    /// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...

  5. 初识jQuery(2)

    1.DOM模型 1.1以对象描述文档的方式就是DOM 节点对象就是被称为DOM对象(标签对象) 1.2节点 元素节点(标签) 文本节点(标签内容) 属性节点(标签属性) 2.Jquery语法结构 $( ...

  6. Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线

    Go beyond yourself rather than beyond others. 上篇文章 深入理解 EventBus 3.0 之使用篇 我们了解了 EventBus 的特性以及如何使用,这 ...

  7. ss-libev 源码解析local篇(4): server_recv_cb之STAGE_STREAM

    继续探索server_recv_cb,我们已经来到了STAGE_STREAM状态.如果在0.05秒的timer来之前客户端就有数据过来,server_recv_cb被调用,此时已经在stream状态就 ...

  8. 错误:XMLHttpRequest cannot load

    原因:Chrome浏览器不支持本地ajax访问,具体就是ajax不能访问file 有3种解决办法:http://frabbit2013.blog.51cto.com/1067958/1254285 其 ...

  9. xcode6 添加.pch文件

    1, 新建文件 (command+N)ios-选择other组,再次选择PCH File,输入文件名保存. eg: 创建的工程为Demo; 创建文件名为DemoPrefixHeader.pch 2,到 ...

  10. linux下利用inode删除指定文件文件

    本文主要介绍使用inode删除异常文件名的文件的方法,供大家参考: 在Linux中,有时候会遇到文件名是乱码或者是某些特殊中文的文件,这时候通过文件名就很难删除. 同时,对于linux中的任何一个文件 ...