Giả sử ta có chuỗi nhị phân s. Xét phép toán lật một bit. Chuỗi s gọi là chuỗi xen kẽ (alternating) nếu không có hai ký tự liền kề nào giống nhau. Ta phải tìm số phép toán tối thiểu để làm cho s trở thành chuỗi xen kẽ.
Ví dụ: s = "11100011", kết quả là 3 vì nếu lật bit tại vị trí 1, 4, 7 thì thành "10101010" - tất cả đều xen kẽ.
Giải thuật
change := 0even_1 := 0, even_0 := 0odd_1 := 0, odd_0 := 0- For
itừ 0 đếnlen(s) - 1:- Nếu
ichẵn:- Nếu
s[i] == '1':even_1++ - Ngược lại:
even_0++
- Nếu
- Ngược lại (i lẻ):
- Nếu
s[i] == '1':odd_1++ - Ngược lại:
odd_0++
- Nếu
- Nếu
- Nếu
(even_1 + odd_0) > (even_0 + odd_1):change := even_0 + odd_1 - Ngược lại:
change := even_1 + odd_0 - Trả về
change
Ví dụ (Python)
def solve(s):
change = 0
even_1 = even_0 = 0
odd_1 = odd_0 = 0
for i in range(len(s)):
if i % 2 == 0:
if s[i] == '1':
even_1 += 1
else:
even_0 += 1
else:
if s[i] == '1':
odd_1 += 1
else:
odd_0 += 1
if (even_1 + odd_0) > (even_0 + odd_1):
change = even_0 + odd_1
else:
change = even_1 + odd_0
return change
s = "11100011"
print(solve(s))
Input
"11100011"
Output
3