首页 > 其他分享 >判断一个字符串是否由另一个字符串旋转而成

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

时间:2023-06-09 16:38:50浏览次数:40  
标签:return s2 s1 旋转 而成 字符串 tmp1 str1 size


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

相关文章

  • 使字符串从两边往中间出现
    #include<stdio.h>intmain(){chararr1[]="jiakesinb!!!";chararr2[]="############";intleft=0;//左下标//intright=sizeof(arr1)/sizeof(arr1[0])-2;//右下标,数组最后有“\0”intright=strlen(arr1)-1;//右下标......
  • 百度随机阴影旋转验证码破解
    之前我百度没有阴影的旋转验证码,有小伙伴反馈他那里的百度验证码是有随机阴影的,原本的不带阴影的识别效果很差。所以专门针对性的做了开发识别。没有随机阴影的可以看这一篇博客《百度旋转验证码破解》识别效果可视化展示这种带随机阴影的验证码和之前没有阴影的有一点差异,特别......
  • 真空旋转蒸发器行业市场现状调研及未来趋势报告2023-2029
    2023-2029全球真空旋转蒸发器行业调研及趋势分析报告2022年全球真空旋转蒸发器市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。随着工业自动化和智能化的发展,真空旋转蒸发器也将朝着自动化和智......
  • 字符串和格式化
    #创建s=''s1=str()print(s,type(s))print(s1,type(s1))#拼接字符串【+加号】str1='@明日科技@扎克伯格@于红梅@勤奋的天使'#定义第一个字符串str2='@明日科技@扎克伯格@于红梅@勤奋的天使'#定义第二个字符串print(str1+str2)#第一种str3=str1+str2#第......
  • 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
    privatestaticvoidstringSubLen(Stringmsg){intmax=0;intleft=0;Map<Character,Integer>map=newHashMap<>();for(inti=0;i<msg.length();i++){if(map.containsKey(msg.charAt(i))){intdiff=i......
  • 字符串转LocalDateTime
    /***yyyy-MM-ddHH:mm:ss转LocalDateTime*@paramexpectStartTime*@return*/publicstaticLocalDateTimestrToLocalDateTime(StringexpectStartTime){returnLocalDateTime.parse(expectStartTime,DateTimeFormatter.ofPattern("yyyy-MM-ddHH:......
  • JAVA面试题解惑系列(六)——字符串(String)杂谈
    关键字:java面试题字符串string作者:臧圩人(zangweiren)网址:http://zangweiren.javaeye.com上一次我们已经一起回顾了面试题中常考的到底创建了几个String对象的相关知识,这一次我们以几个常见面试题为引子,来回顾一下String对象相关的其它一些方面。String的l......
  • Leet Code 1684. 统计一致字符串的数目
    /***1684.统计一致字符串的数目**给你一个由不同字符组成的字符串allowed和一个字符串数组words。如果一个字符串的每一个字符都在allowed中,就称这个字符串是*一致字符串。**请你返回words数组中一致字符串的数目。****示例1:**......
  • LeetCode 2116. 判断一个括号字符串是否有效
    importjava.util.ArrayDeque;importjava.util.Deque;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;/***一个括号字符串是只由'('和')'组成的非空字符串。如果一个字符串满足下面任意一个条件,那么它就是有......
  • 实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。
    实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。先说明问题的产生,在自己写着玩的时候,新建了一个User类如下:packagecom.ma.xdo;importlombok.*;importjava.io.Serializable;/***@ClassNameUser*@DescriptionTODO*@Author@O_o*@Date2023/6/814:......