if s1 = "stackoverflow"
then the following are some of its rotated versions:
"tackoverflows"
"ackoverflowst"
"overflowstack"
where as "stackoverflwo"
is not a rotated version.
通常的做法
algorithm checkRotation
(
string
s1
,
string
s2
)
if
(
len
(
s1
)
!=
len
(
s2
))
return
false
if
(
substring
(
s2
,
concat
(
s1
,
s1
))
return
true
return
false
end
一个基于KMP的解决方案
bool
is_rotation
(
const
string
&
str1
,
const
string
&
str2
)
{
if
(
str1
.
size
()!=
str2
.
size
())
return
false
;
vector
<size_t>
prefixes
(
str1
.
size
(),
0
);
for
(
size_t i
=
1
,
j
=
0
;
i
<
str1
.
size
();
i
++)
{
while
(
j
>
0
&&
str1
[
i
]!=
str1
[
j
])
j
=
prefixes
[
j
-
1
];
if
(
str1
[
i
]==
str1
[
j
])
j
++;
prefixes
[
i
]=
j
;
}
size_t i
=
0
,
j
=
0
;
for
(;
i
<
str2
.
size
();
i
++)
{
while
(
j
>
0
&&
str2
[
i
]!=
str1
[
j
])
j
=
prefixes
[
j
-
1
];
if
(
str2
[
i
]==
str1
[
j
])
j
++;
}
for
(
i
=
0
;
i
<
str2
.
size
();
i
++)
{
if
(
j
>=
str1
.
size
())
return
true
;
while
(
j
>
0
&&
str2
[
i
]!=
str1
[
j
])
j
=
prefixes
[
j
-
1
];
if
(
str2
[
i
]==
str1
[
j
])
j
++;
}
return
false
;
}
int
is_rotation
(
char
*
s1
,
char
*
s2
)
{
char
*
tmp1
;
char
*
tmp2
;
char
*
ref2
;
assert
(
s1
&&
s2
);
if
((
s1
==
s2
)
||
(
strcmp
(
s1
,
s2
)
==
0
))
return
(
1
);
if
(
strlen
(
s1
)
!=
strlen
(
s2
))
return
(
0
);
while
(*
s2
)
{
tmp1
=
s1
;
if
((
ref2
=
strchr
(
s2
,
*
s1
))
==
NULL
)
return
(
0
);
tmp2
=
ref2
;
while
(*
tmp1
&&
(*
tmp1
==
*
tmp2
))
{
++
tmp1
;
++
tmp2
;
if
(*
tmp2
==
'/0'
)
tmp2
=
s2
;
}
if
(*
tmp1
==
'/0'
)
return
(
1
);
else
++
s2
;
}
return
(
0
);
}
标签:return,s2,s1,旋转,而成,字符串,tmp1,str1,size
From: https://blog.51cto.com/u_16156420/6449048