Chuỗi đối xứng (palindrome) đọc từ trái sang phải và phải sang trái giống nhau. Ví dụ: "madam", "racecar", "level".
Cách 1: Slicing (Pythonic, ngắn gọn)
def is_palindrome(s):
return s == s[::-1]
# Test
tests = ["madam", "python", "racecar", "A man a plan a canal Panama"]
for t in tests:
# Chuẩn hóa: bỏ space, lowercase
clean = ''.join(c.lower() for c in t if c.isalnum())
print(f"'{t}' → {is_palindrome(clean)}")
Kết quả
'madam' → True
'python' → False
'racecar' → True
'A man a plan a canal Panama' → True
Cách 2: Two pointers (tiết kiệm bộ nhớ)
def is_palindrome_two_ptr(s):
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
Cách 3: Đệ quy
def is_palindrome_recursive(s):
if len(s) <= 1:
return True
if s[0] != s[-1]:
return False
return is_palindrome_recursive(s[1:-1])
So sánh
| Phương pháp | Thời gian | Không gian | Đặc điểm |
|---|---|---|---|
| Slicing [::-1] | O(n) | O(n) | Ngắn gọn, Pythonic |
| Two pointers | O(n) | O(1) | Tiết kiệm memory |
| Đệ quy | O(n) | O(n) | Stack overflow nếu n lớn |
Ứng dụng mở rộng
- Kiểm tra số palindrome:
str(n) == str(n)[::-1]. - Tìm palindrome con dài nhất (Manacher's algorithm O(n)).
- Bioinformatics: palindrome DNA sequence.