📘 題目敘述
給定兩個字串 s 與 goal,請回傳 true 當且僅當 s 可以經過「若干次位移」變成 goal。
一次位移(shift)的定義是:把 s 的最左邊字元移到最右邊。
條件限制
1 ≤ s.length, goal.length ≤ 100s與goal只包含小寫英文字母
🧠 解題思路
我的想法是:直接枚舉「旋轉的起點」。
- 如果
s能旋轉成goal,代表存在某個起點i - 讓
s從i開始讀(並且尾巴接回開頭)剛好等於goal
所以我會:
- 先檢查長度:
s.size() != goal.size()直接false - 枚舉每個可能的起點
i(代表旋轉i次的效果) - 對每個
i,逐字比對:用s[(i + j) % n]去對goal[j] - 只要某個
i全部字元都吻合,就回傳true - 所有
i都試完仍沒成功,就回傳false
所有變數
n:字串s的長度(也等於goal的長度)i:目前假設的「旋轉起點」(相當於旋轉幾次)j:用來逐字比對的位置check:這次起點i是否能完整匹配goal
為什麼用 s[(i + j) % n]?
因為旋轉後的字串其實就是:
- 從
s[i]一路讀到結尾 - 再接回
s[0]繼續讀
用 (i + j) % n 就能把「超出範圍的索引」繞回開頭,模擬旋轉後的讀法。
🪜 主要流程步驟
- 若
s與goal長度不同,直接回傳false - 枚舉每個起點
i,逐字比對旋轉後的字元 - 一旦某次比對完全成功,立即回傳
true - 全部起點都失敗,回傳
false
💻 程式碼實作
class Solution {
public:
bool rotateString(string s, string goal) {
if (s.size() != goal.size()) {
return false;
}
int n = s.size();
for (int i = 0; i < n; i++) {
bool check = true;
for (int j = 0; j < n; j++) {
if (s[(i + j) % n] != goal[j]) {
check = false;
break;
}
}
if (check) {
return true;
}
}
return false;
}
};
🔗 題目連結
https://leetcode.com/problems/rotate-string/