📘 題目敘述
給你一個二進位字串 s,且 s 沒有前導零,若 s 中最多只包含一段連續的 1,回傳 true。否則回傳 false。
條件限制
1 <= s.length <= 100s[i]是'0'或'1's[0]是'1'
🧠 解題思路
我用一個布林變數 check 來記錄「我是否已經進入過 0 的區段」。
因為題目要的是:1 只能出現一段連續區間。所以只要我掃描字串時:
- 一旦看過
0,之後如果又看到1,那就代表1被分成至少兩段 → 直接false - 如果一路掃完都沒有出現「看過 0 後又遇到 1」的情況 →
true
所有變數
s:題目輸入的二進位字串check:是否已經遇到過'0'(也就是是否已經離開第一段的1)a:for 迴圈每次讀到的字元
🪜 主要流程步驟
1. 用 check 記錄是否已經遇到過 0
一開始 check = false,代表目前還沒遇到 0,也就是仍可能在第一段連續的 1 裡。
2. 掃描字串,遇到 '0' 就把 check 設成 true
當我第一次遇到 '0',就表示第一段 1 已經結束了。之後只要再出現 '1',就會形成第二段。
3. 如果 check 已經是 true,卻又遇到 '1',直接回傳 false
這代表字串形狀像 ...1...0...1...,1 不再是單一連續段。
4. 全部掃完都沒違規就回傳 true
表示 1 只出現一段(例如 "111"、"11000"、"10")。
⏱️ 複雜度
- 時間複雜度:
O(n),其中n = s.length() - 空間複雜度:
O(1)
💻 程式碼實作
class Solution {
public:
bool checkOnesSegment(string s) {
bool check = false;
for (char a : s) {
if (a == '1') {
if (check) {
return false;
}
} else {
check = true;
}
}
return true;
}
};
🔗 題目連結
https://leetcode.com/problems/check-if-binary-string-has-at-most-one-segment-of-ones/