796. Rotate String

練習日期:2026-01-06

難度:Easy

類型:String、String Matching

📘 題目敘述

給定兩個字串 sgoal,請回傳 true 當且僅當 s 可以經過「若干次位移」變成 goal

一次位移(shift)的定義是:把 s 的最左邊字元移到最右邊。

條件限制

  • 1 ≤ s.length, goal.length ≤ 100
  • sgoal 只包含小寫英文字母

🧠 解題思路

我的想法是:直接枚舉「旋轉的起點」。

  • 如果 s 能旋轉成 goal,代表存在某個起點 i
  • si 開始讀(並且尾巴接回開頭)剛好等於 goal

所以我會:

  1. 先檢查長度:s.size() != goal.size() 直接 false
  2. 枚舉每個可能的起點 i(代表旋轉 i 次的效果)
  3. 對每個 i,逐字比對:用 s[(i + j) % n] 去對 goal[j]
  4. 只要某個 i 全部字元都吻合,就回傳 true
  5. 所有 i 都試完仍沒成功,就回傳 false

所有變數

  • n:字串 s 的長度(也等於 goal 的長度)
  • i:目前假設的「旋轉起點」(相當於旋轉幾次)
  • j:用來逐字比對的位置
  • check:這次起點 i 是否能完整匹配 goal

為什麼用 s[(i + j) % n]

因為旋轉後的字串其實就是:

  • s[i] 一路讀到結尾
  • 再接回 s[0] 繼續讀

(i + j) % n 就能把「超出範圍的索引」繞回開頭,模擬旋轉後的讀法。

🪜 主要流程步驟

  1. sgoal 長度不同,直接回傳 false
  2. 枚舉每個起點 i,逐字比對旋轉後的字元
  3. 一旦某次比對完全成功,立即回傳 true
  4. 全部起點都失敗,回傳 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/

作者: scottnick
撰寫日期: 2026-01-06
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/796-rotate-string.html