返回

力扣刷题-796:旋转字符串

前端

题目

给定两个字符串 AB,判断 A 是否可以通过旋转字符串得到 B

字符串 A 的旋转字符串可以是 A 的任何一个子串重复多次组成的字符串。如果 AB 长度相等,则 A 可以通过旋转字符串得到 B

例如:

A = "abcde"
B = "cdeab"

输出:true

解题思路

暴力解法

暴力解法非常简单,我们只需要将 A 复制多次,直到它的长度大于或等于 B。然后,我们从 A 的开头开始,逐个字符地比较 AB。如果在某个位置遇到不匹配的情况,我们就把 A 向右旋转一位,然后继续比较。如果我们比较到 A 的结尾也没有发现不匹配的情况,那么就说明 A 可以通过旋转字符串得到 B

双指针法

双指针法是一种更为高效的解法。我们使用两个指针 ij,分别指向 AB 的开头。我们逐个字符地比较 AB,如果遇到不匹配的情况,我们将指针 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 题——旋转字符串。我们分析了题目,提供了两种解题思路,并实现了这两种解法。我们还对这两种解法进行了比较,帮助你更好地理解这道题。希望这篇文章对你有帮助!