题目描述:
We are given two strings, A
and B
.
A shift on A
consists of taking string A
and moving the leftmost character to the rightmost position. For example, if A = 'abcde'
, then it will be 'bcdea'
after one shift on A
. Return True
if and only if A
can become B
after some number of shifts on A
.
Example 1:Input: A = 'abcde', B = 'cdeab'Output: trueExample 2:Input: A = 'abcde', B = 'abced'Output: false
Note:
A
andB
will have length at most100
.
要完成的函数:
bool rotateString(string A, string B)
说明:
1、给定两个字符串A和B,要求判断这两个字符串,可不可以通过不断地把A中的首字母搬到末尾去,最终把A变成B。比如A为abcde,B为cdeab,就是可以通过前述操作把A变成B的。
2、明白题意,笔者最开始觉得这种结构很熟悉,应该是队列的操作,可以定义一个队列,把A中的字母塞到队列中去,然后不断地取出首位,插入到末位,判断是不是能形成B字符串。
不过这样子还要定义一个队列,操作略显麻烦,直觉这样做并不是最简便的方法。
之后想到其实找到B首字母,比如上面给的例子,A是abcde,B是cdeab,B中首字母是c,那么找到c在A中的位置j,然后逐位比较A[j]和B[i](i从0开始)是否相等,这是A中后半部分的比较。
然后再比较A中前半部分是否与B中剩余部分相等。我们已知了j的位置,这些操作都是非常容易的。
这道题就可以做出来了。
不过,当碰到B中首字母在A中多次出现,而且首次出现还匹配不上,得第二次才匹配上的情况,比如A是abcdecdf,B是cdfabcde。
如果只是一次搜索,c在A中位置是第三位,这时匹配不成功。
但如果c在A中位置是倒数第三位那里,这时候的匹配就是成功的。
所以之前的做法就得在外面再加多个循环,一直迭代,直到搜索到能匹配的位置。
代码如下:(附详解)
bool rotateString(string A, string B) { int i=0,j=0,s1=A.size(),s2=B.size(); if(s1!=s2)//边界条件 return false; if(s1==0)//边界条件,比如A和B都是空字符串 return true; bool flag; while(j
上述代码实测3ms,beats 97.87% of cpp submissions。