Palindrome (Chuỗi đối xứng) là gì?
Một palindrome là chuỗi giống hệt nhau khi đọc từ trái sang phải hoặc từ phải sang trái. Nói cách khác, chuỗi palindrome là chuỗi mà đảo ngược của nó bằng chính chuỗi gốc.
Ví dụ: civic, madam là palindrome.
Cat không phải palindrome. Vì đảo ngược là tac, không bằng chuỗi gốc cat.
Viết chương trình kiểm tra chuỗi đầu vào có phải palindrome hay không.
Phương pháp 1 – Tìm chuỗi đảo ngược
- Chính việc cần làm là tìm chuỗi đảo ngược.
- Đảo ngược có thể tìm bằng nhiều cách. Dùng phương pháp slicing đơn giản:
s[::-1]. Cũng có thể dùng''.join(reversed()). Dù có cách khác, ta dùng cách đơn giản. - So sánh chuỗi đảo ngược với chuỗi gốc.
- Trả về
Truenếu bằng nhau, ngược lạiFalse.
Ví dụ
def isPalindrome(s):
rev = s[::-1]
if rev == s:
return True
return False
print("Nhập chuỗi:")
st = input()
print(isPalindrome(st))Kết quả
Nhập chuỗi madam True
Phương pháp 2 – Không tìm chuỗi đảo ngược
Ý tưởng: liên tục so sánh ký tự ở chỉ số đầu và cuối cho đến khi không bằng nhau.
Xem hai ví dụ không tìm chuỗi đảo ngược:
Chuỗi "madam":
- So sánh ký tự đầu và cuối: bằng nhau. Tiếp tục so sánh ký tự thứ 2 và倒数 thứ 2: bằng nhau. Cuối cùng chỉ còn 1 ký tự. Do đó chuỗi là palindrome.
Chuỗi "reader":
- Các ký tự bằng nhau cho đến so sánh giữa ký tự thứ 2 và倒数 thứ 2.
- Khi so sánh ký tự thứ 3 và倒数 thứ 3, chúng không bằng, do đó không phải palindrome.
- Có thể triển khai ý tưởng này bằng đệ quy (recursion) hoặc hai con trỏ (two pointers). Sử dụng hai con trỏ. Bắt đầu con trỏ
starttại 0 vàendtại chỉ số cuối. So sánh, nếu bằng nhau, tăngstartvà giảmend(đưa chúng đến ký tự thứ 2 và倒数 thứ 2, v.v.). - Khi trả về
False? Nếu tìm thấy cặp con trỏ không bằng, không cần xem thêm, trả vềFalse. - Khi trả về
True? Nếu chuỗi là palindrome, trả vềTruekhi hai con trỏ bằng nhau (chỉ còn 1 ký tự) hoặcstartvượt quáend(đã kiểm tra hết ký tự).
Ví dụ
def isPalindrome(s):
rev = s[::-1]
if rev == s:
return True
return False
print("Nhập chuỗi:")
st = input()
print(isPalindrome(st))Kết quả
Nhập chuỗi reader False Nhập chuỗi madam True