给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置。
输入:
仅一行包含两个字符串a和b
输出:
仅一行一个整数
样例输入 Sample Input
abcd bc
样例输出 Sample Output
2
注意!!!Pascal用户请注意:两个字符串之间可能包含多个空格
寻找子串位置 pascal
答案:1 悬赏:30 手机版
解决时间 2021-04-23 22:02
- 提问者网友:黑米和小志
- 2021-04-23 02:29
最佳答案
- 五星知识达人网友:北方的南先生
- 2021-04-23 03:21
var next:array [1 ..1000001] of longint;
s,t:ansistring;
procedure get_next(t:ansistring);
var j,k:integer;
begin
j:=1; k:=0;
while j<length(t) do
begin
if (k=0) or (t[j]=t[k]) then
begin
inc(j);
inc(k);
next[j]:=k;
end
else k:=next[k];
end;
end;
function index(s:ansistring;t:ansistring):longint;
var i,j:longint;
begin
get_next(t);
index:=0;
i:=1; j:=1;
while (i<=length(s))and(j<=length(t)) do
begin
if (j=0)or(s[i]=t[j]) then
begin
inc(i);
inc(j);
end
else j:=next[j];
if j>length(t) then index:=i-length(t);
end;
end;
begin
readln(s);
t:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
while s[1]=' ' do delete(s,1,1);
writeln(index(t,s));
readln;
end.
s,t:ansistring;
procedure get_next(t:ansistring);
var j,k:integer;
begin
j:=1; k:=0;
while j<length(t) do
begin
if (k=0) or (t[j]=t[k]) then
begin
inc(j);
inc(k);
next[j]:=k;
end
else k:=next[k];
end;
end;
function index(s:ansistring;t:ansistring):longint;
var i,j:longint;
begin
get_next(t);
index:=0;
i:=1; j:=1;
while (i<=length(s))and(j<=length(t)) do
begin
if (j=0)or(s[i]=t[j]) then
begin
inc(i);
inc(j);
end
else j:=next[j];
if j>length(t) then index:=i-length(t);
end;
end;
begin
readln(s);
t:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
while s[1]=' ' do delete(s,1,1);
writeln(index(t,s));
readln;
end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯