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: true Example 2: Input: A = 'abcde', B = 'abced' Output: false
Note:
A
andB
will have length at most100
.
这道题,一拿起来,本来想比较A和B两个字符串中,每个字符,左右两个字符如果都相等,那么就可以变换互相转换,后来写着写着觉得太繁琐,然后再仔细看,连个字符串,其中一个一份为2,然后前后变化即可得到另一个。
例如A = 'abcde', B的第一个字符是c,那么在A中找到c的位置,将A分成ab和cde两个字符串,将cde和ab拼接后,就是B。
算法写起来不难,但是,犯了一个错误,就是A,B中有重复字符串,比方说A = "bbbacddceeb", B = "ceebbbbacdd",
B的第一个字符是c,如果在A中找到第一个c的位置,将cddceeb和bbba拼接后不是B,需要再找到第二个c,ceeb和bbbaccdd拼接后等于B,所以这是个不错的题目。
class Solution {
public:
bool rotateString(string A, string B) {
if(A.size() != B.size())
return false;
if(A.size() == 0 and B.size() == 0)
return true;
if(A.size() == 0 or B.size() == 0)
return false;
char c = B[0];
int pos = A.find(c);
if(pos == string::npos)
return false;
while(pos != string::npos)
{
string s = A.substr(pos);
string sp = A.substr(0, pos);
string news = s + sp;
if(news == B)
return true;
if(pos + 1 < A.size())
pos = A.find(c, pos+1);
else
return false;
}
return false;
}
};