สมมติว่าเรามีสตริงไบนารี s สมมติว่าเราสามารถนำหน้าของ s มาไว้ข้างหลังได้ จากนั้นให้หาจำนวนอักขระขั้นต่ำที่ต้องพลิกเพื่อไม่ให้มีอักขระต่อเนื่องกันที่มีค่าเท่ากัน
ดังนั้น หากอินพุตเป็น s ="10010101111" ผลลัพธ์จะเป็น 2 เนื่องจากเราสามารถนำหน้า "10" ได้ จากนั้นเลื่อนไปทางด้านหลังเพื่อให้สตริงเป็น "01010111110" จากนั้นจึงพลิกบิตที่ 3 และ 5 จากขวาเป็น 0 ("01010101010")
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ตอบ :=ไซส์ S
-
N :=ไซส์ S
-
s :=0
-
สำหรับฉันอยู่ในช่วง 0 ถึง 2 * N ทำ
-
s :=s + จำนวนเต็มของ (S[i mod N] XOR (i AND 1))
-
ถ้า i>=N - 1 แล้ว
-
ans :=ขั้นต่ำของ ans, s และ N - s
-
s :=s - จำนวนเต็มของ (S[(i -(N - 1)) mod N]) XOR ((i - (N - 1)) และ 1)
-
-
-
กลับมาอีกครั้ง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution: def solve(self, S): ans = N = len(S) s = 0 for i in range(2 * N): s += int(S[i % N]) ^ (i & 1) if i >= N - 1: ans = min(ans, s, N - s) s -= int(S[(i - (N - 1)) % N]) ^ ((i - (N - 1)) & 1) return ans ob = Solution() s = "10010101111" print(ob.solve(s))
อินพุต
"10010101111"
ผลลัพธ์
2