返回
力扣刷题-796:旋转字符串
前端
2024-01-01 18:45:48
题目
给定两个字符串 A
和 B
,判断 A
是否可以通过旋转字符串得到 B
。
字符串 A
的旋转字符串可以是 A
的任何一个子串重复多次组成的字符串。如果 A
和 B
长度相等,则 A
可以通过旋转字符串得到 B
。
例如:
A = "abcde"
B = "cdeab"
输出:true
解题思路
暴力解法
暴力解法非常简单,我们只需要将 A
复制多次,直到它的长度大于或等于 B
。然后,我们从 A
的开头开始,逐个字符地比较 A
和 B
。如果在某个位置遇到不匹配的情况,我们就把 A
向右旋转一位,然后继续比较。如果我们比较到 A
的结尾也没有发现不匹配的情况,那么就说明 A
可以通过旋转字符串得到 B
。
双指针法
双指针法是一种更为高效的解法。我们使用两个指针 i
和 j
,分别指向 A
和 B
的开头。我们逐个字符地比较 A
和 B
,如果遇到不匹配的情况,我们将指针 j
向右移动一位,并继续比较。如果我们比较到 B
的结尾也没有发现不匹配的情况,那么就说明 A
可以通过旋转字符串得到 B
。
实现
Python 实现
def is_rotated_string(A, B):
"""
判断 A 是否可以通过旋转字符串得到 B。
参数:
A (str): 字符串 A。
B (str): 字符串 B。
返回:
bool: 如果 A 可以通过旋转字符串得到 B,则返回 True,否则返回 False。
"""
# 暴力解法
A_repeated = A * 2
return B in A_repeated
# 双指针法
def is_rotated_string(A, B):
"""
判断 A 是否可以通过旋转字符串得到 B。
参数:
A (str): 字符串 A。
B (str): 字符串 B。
返回:
bool: 如果 A 可以通过旋转字符串得到 B,则返回 True,否则返回 False。
"""
if len(A) != len(B):
return False
i = 0
j = 0
while i < len(A):
if A[i] != B[j]:
j += 1
if j == len(A):
j = 0
i -= 1
i += 1
return j == 0
Java 实现
class Solution {
/**
* 判断 A 是否可以通过旋转字符串得到 B。
*
* @param A 字符串 A。
* @param B 字符串 B。
* @return 如果 A 可以通过旋转字符串得到 B,则返回 True,否则返回 False。
*/
public boolean isRotatedString(String A, String B) {
// 暴力解法
String A_repeated = A + A;
return B.indexOf(A_repeated) >= 0;
}
/**
* 判断 A 是否可以通过旋转字符串得到 B。
*
* @param A 字符串 A。
* @param B 字符串 B。
* @return 如果 A 可以通过旋转字符串得到 B,则返回 True,否则返回 False。
*/
public boolean isRotatedString(String A, String B) {
if (A.length() != B.length()) {
return false;
}
int i = 0;
int j = 0;
while (i < A.length()) {
if (A.charAt(i) != B.charAt(j)) {
j++;
if (j == A.length()) {
j = 0;
}
i--;
}
i++;
}
return j == 0;
}
}
比较
暴力解法和双指针法的复杂度都是 O(n^2)
,其中 n
是字符串 A
的长度。然而,双指针法的常数因子较小,因此在实践中往往比暴力解法快得多。
总结
这篇文章介绍了 LeetCode 上的第 796 题——旋转字符串。我们分析了题目,提供了两种解题思路,并实现了这两种解法。我们还对这两种解法进行了比较,帮助你更好地理解这道题。希望这篇文章对你有帮助!