Chuỗi đối xứng (palindrome) đọc từ trái sang phải và từ phải sang trái giống nhau (bỏ qua chữ hoa/thường, khoảng trắng, dấu câu). Ví dụ: "Malayalam", "A man a plan a canal Panama".
Mã nguồn (cách cơ bản: đảo ngược so sánh)
using System;
namespace PalindromeCheck {
class Program {
static void Main(string[] args) {
string input = "Malayalam";
// Chuyển thành mảng char, đảo ngược, tạo chuỗi mới
char[] chars = input.ToCharArray();
Array.Reverse(chars);
string reversed = new string(chars);
// So sánh không phân biệt hoa/thường
bool isPalindrome = input.Equals(reversed, StringComparison.OrdinalIgnoreCase);
if (isPalindrome) {
Console.WriteLine($"\"{input}\" là chuỗi đối xứng (Palindrome)!");
} else {
Console.WriteLine($"\"{input}\" KHÔNG phải chuỗi đối xứng.");
}
Console.Read();
}
}
}
Kết quả
"Malayalam" là chuỗi đối xứng (Palindrome)!)
Cách tối ưu: Hai con trỏ (Two Pointers) - O(1) space
static bool IsPalindrome(string s) {
int left = 0, right = s.Length - 1;
while (left < right) {
// Bỏ qua ký tự không phải chữ/số
while (left < right && !char.IsLetterOrDigit(s[left])) left++;
while (left < right && !char.IsLetterOrDigit(s[right])) right--;
if (char.ToLower(s[left]) != char.ToLower(s[right]))
return false;
left++;
right--;
}
return true;
}
So sánh
| Phương pháp | Không gian | Xử lý space/punctuation | Unicode |
|---|---|---|---|
| Đảo ngược + Equals | O(n) | Không (so sánh nguyên chuỗi) | Có (OrdinalIgnoreCase) |
| Two Pointers | O(1) | Có (bỏ qua non-alnum) | Có (char.ToLower) |
| LINQ Reverse + SequenceEqual | O(n) | Cần filter trước | Có |
Lưu ý
- Code gốc so sánh nguyên chuỗi —
"A man a plan"sẽ KHÔNG được coi là palindrome do có space. StringComparison.OrdinalIgnoreCasean toàn culture (tránh Turkish I problem).- Để kiểm tra số palindrome:
n.ToString()rồi dùng logic trên.