Làm mịn từ “đọc ngược vẫn như cũ”
Xâu đối xứng giữ nguyên khi đảo thứ tự kí tự. Thay vì đảo cả xâu, so các cặp tương ứng từ hai đầu: vị trí `i` ở trái và `len(s)-1-i` ở phải. Nếu một cặp khác nhau, trả `False`; nếu so hết nửa xâu không thấy khác, trả `True`. Với xâu có số kí tự lẻ, kí tự giữa tự khớp với chính nó nên không cần kiểm. Theo bài toán này, **mỗi kí tự được giữ nguyên đúng như đã nhập**: chữ hoa, chữ thường và dấu cách đều được tính.
Chỉ duyệt nửa xâu
```python
def doi_xung(s):
for i in range(len(s) // 2):
if s[i] != s[len(s) - 1 - i]:
return False
return True
print(doi_xung("abccba"))
print(doi_xung("abca"))
print(doi_xung(""))
```
Kết quả lần lượt là `True`, `False`, `True`. Xâu rỗng không có cặp nào trái nhau, nên được xem là đối xứng. Với `"abca"`, cặp ngoài `a`–`a` khớp nhưng cặp `b`–`c` khác, nên phải tiếp tục đến cặp trong mới kết luận. So trực tiếp các cặp giúp nhận ra bước con cần thiết của thiết kế làm mịn dần.
Bài luyện
Theo hàm trong bài, xâu nào là đối xứng?
Cặp b và c khác nhau.
Các cặp a–a, b–b, c–c đều khớp.
A hoa khác a thường.
Dấu cách ở cuối không khớp x đầu.
Lời giải
Đọc ngược "abccba" vẫn được "abccba"; các cặp đối xứng đều bằng nhau.
Bài luyện
Trong mã `doi_xung`, kí tự bên phải tương ứng với `s[i]` có chỉ số nào?
Đây là ô kế tiếp bên trái.
Vị trí cuối là len(s)-1, lùi i ô.
Chỉ số này vượt độ dài.
Đây là vùng giữa, không phải cặp tương ứng.
Lời giải
Vị trí đối xứng của chỉ số i tính từ trái là chỉ số len(s)-1-i tính trong Python.
Bài luyện
`doi_xung("")` trả gì?
Không có cặp khác nhau; vòng lặp rỗng và hàm trả True.
Không có phản ví dụ để trả False.
Hàm có return True sau vòng.
range(0) hợp lệ.
Lời giải
len(s)//2 bằng 0, nên không xét cặp nào và trả True theo quy ước xâu rỗng đối xứng.
Đang học