《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及这里:https://github.com/alexhagiopol/cracking-the-coding-interview
bool stringRotation(const std::string &s1, const std::string& s2)
{
int len=s1.size();
if((len==s2.size()) && (len>0))
{
const std::string s3 = s1 + s1;
return s3.find(s2) != std::string::npos;
}
return false;
}
字符串旋转的定义:对于字符串
s
1
s_{1}
s1,从某位置将字符串
s
1
s_{1}
s1划分为两部分x和y,x为其前面部分,y为其后面部分即
s
1
=
(
x
)
:
(
y
)
s_{1}=(x):(y)
s1=(x):(y),则将
s
1
s_{1}
s1从该划分点旋转可以得到字符串
s
2
s_{2}
s2,即
s
2
=
(
y
)
:
(
x
)
s_{2}=(y):(x)
s2=(y):(x)。例如对于字符串
“
w
a
t
e
r
”
“water”
“water”,将其从字符
′
a
′
'a'
′a′和
′
t
′
't'
′t′的链接处划分后可以得到
x
=
"
w
a
"
x="wa"
x="wa" ,
y
=
"
t
e
r
"
y="ter"
y="ter"。旋转后得到的字符串为
“
t
e
r
w
a
”
“terwa”
“terwa”。
如果字符串
s
1
=
(
x
)
:
(
y
)
s_{1}=(x):(y)
s1=(x):(y), 则
s
1
+
s
1
=
(
x
)
:
(
y
)
:
(
x
)
:
(
y
)
=
(
x
)
:
s
2
:
(
y
)
s_{1}+s_{1}=(x):(y):(x):(y)=(x):s_{2}:(y)
s1+s1=(x):(y):(x):(y)=(x):s2:(y)。因此如果字符串
s
2
=
(
y
)
:
(
x
)
s_{2}=(y):(x)
s2=(y):(x)为字符串字符串
s
1
s_{1}
s1旋转而来,则字符串
s
2
s_{2}
s2为字符串
s
1
+
s
1
s_{1}+s_{1}
s1+s1的字串。这就是算法的大致原理。
该算法的时间和空间复杂度取决于函数find的时间和空间复杂度(不知对不对?)。