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$ 次即可确定结果。
该方法简单直观,易于实现且满足题目约束。