您的位置:首页 > 其它

2018.3.10 模拟赛——(2)给出字符串

2018-03-17 16:14 169 查看

题目大意:

给出一个由小写字母组成的字符串。你的任务是找出其最长的出现至少两次的子串的长度。这些重复出现的子串可以重叠,比如:ababa aba视为出现两次

解题思路:

数据较小,字符串长度≤100。

所以,枚举就可以过

首先枚举子串,然后在字符串里找子串(注意不能用pos,因为子串可以重叠)。找子串的过程也是枚举(方法比较low)

var
s,s1,s2:string;
i,j,n,maxn,sum,k,b:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end;
begin
read(s);
n:=length(s);
for i:=1 to n do
for j:=i to n do
begin
sum:=0;
s2:=s;
s1:=copy(s,i,j-i+1);//枚举子串并取出
k:=1;
b:=length(s1);//如果s2[k]到s2[b]与s1完全相等
//则sum+1
while (b<=n)and(sum<2) do
//若b超出字符串范围,则子串出现不到两次,退出循环
//如果子串出现两次,则不用继续找,退出循环
begin
if copy(s2,k,length(s1))=s1 then
inc(sum);
inc(k);
inc(b);//继续枚举
end;
if sum>1 then
maxn:=max(length(s1),maxn);
//如果子串出现两次,与原先子串长度比较,取较长的子串的长度
end;
write(maxn);//愉快的输出
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐