左旋字符串(c语言)

题目1:实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

法一:暴力解法,以abcdef变成bcdefa为例,写循环把a存到tmp里然后
把bcdef往前移,最后把a放到最后

代码如下:

左旋字符串(c语言)_第1张图片

 法二:以abcdef变成cdefab为例
首先ab倒序变成bacdef,然后cdef倒序变成bafedc,然后整个倒序变成cdefab(三步倒序法)

代码如下:

左旋字符串(c语言)_第2张图片

题目2:

 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1

给定s1 = abcd和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

 思路:

法一:暴力解法,我们以cdefab是否由abcdef左旋k个字符而来为例,可以有上面代码写的left_relove函数,然后,将abcdef从1个字符左旋开始,然后左旋2个,知道左旋到abcdef的长度也就是6个字符为止,如果过程中左旋第k个字符时,两个字符串相等,则可以说明cdefab是否由abcdef左旋k个字符而来

法二:我们以cdefab是否由abcdef左旋k个字符而来为例,我们可以把abcdef追加自身变成abcdefabcdef;这样abcdef左旋k个字符后的结果一定是abcdefabcdef的子字符串,所以只要判断cdefab是否是abcdefabcdef的子字符串即可,当然还要判断追加前abcdef和cdefab是否相等,如果不等就不可能是左旋的来的

法一有兴趣的人可以自己去实现下,这里提供法二的代码:

左旋字符串(c语言)_第3张图片

 

你可能感兴趣的:(c语言)