题目(难度:简单):
给定两个字符串, A 和 B。
A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。
示例 1:
输入: A = 'abcde', B = 'cdeab'
输出: true
示例 2:
输入: A = 'abcde', B = 'abced'
输出: false
代码思想:
利用局部交换,将原字符串分为左边旋转部分和右边未旋转部分,分别对这两部分进行旋转,再最后对整个字符串旋转得到结果。
代码实现:
public boolean rotateString(String A, String B) {
if (A == null && B == null || A.length() == 0 && B.length() == 0) return true;
if (A == null || B == null || A.length() == 0 || B.length() == 0 || A.length() != B.length()) return false;
char[] a = A.toCharArray();
int index = 0;
if (A.equals(B)) return true;
while (index <= a.length - 1) {
char[] tmp = Arrays.copyOfRange(a, 0, a.length);
reverse(tmp, 0, index);
reverse(tmp, index + 1, a.length - 1);
reverse(tmp, 0, a.length - 1);
if (String.valueOf(tmp).equals(B)) {
return true;
} else {
index++;
}
}
return false;
}
public void reverse(char[] array, int l, int r) {
while (l < r) {
char tmp = array[l];
array[l] = array[r];
array[r] = tmp;
l++;
r--;
}
}
测试用例:
算法分析:
时间复杂度O(n),额外空间复杂度O(1)