跳转至

ABC103B String Rotation

题意分析

给定两个长度相同的字符串 $S$ 和 $T$,你可以对字符串 $S$ 进行若干次操作:

  • 每次操作将字符串 $S$ 的第一个字符移到字符串末尾。

问是否存在若干次操作(包括 $0$ 次)后,使得 $S$ 和 $T$ 相等。


解题思路

本题的核心是判断 $T$ 是否是 $S$ 的循环移位(旋转)字符串。

  • 每次操作是将 $S$ 的第一个字符移到末尾,实际上是循环左移字符串 $1$ 位;
  • 经过最多 $n$ 次操作($n = S.size()$),可以得到所有可能的循环移位字符串;
  • 只需枚举所有循环移位后的字符串是否有与 $T$ 相同的即可;
  • 可以用字符串切片拼接来实现循环移位:
    • 对于每次操作,令新字符串为 S.substr(1) + S[0]
    • 判断新字符串是否等于 $T$;
  • 若有相等,输出 Yes,否则输出 No

复杂度分析

  • 枚举最多 $n$ 次循环移位,设字符串长度为 $n$,
  • 每次比较字符串耗时 $O(n)$,
  • 总时间复杂度为 $O(n^2)$,
  • 适合 $n \leq 100$ 的题目限制。

总结

  • 利用循环移位的性质,将字符串 $S$ 循环左移并判断是否能匹配 $T$;
  • 通过字符串切片拼接方便实现旋转操作;
  • 最多尝试 $n$ 次即可确定结果。

该方法简单直观,易于实现且满足题目约束。