判断一个字符串是否由另一个字符串旋转而成

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 ;
}


c版本
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 );
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值