Skip to main content

[E] Valid Palindrome

Đề bài

Một cụm từ được gọi là palindrome nếu sau khi đã convert sang lowercase + loại giữ ký tự đặc biệt và nó đọc từ trái sang phải và từ phải sang trái đều giống nhau. \

Cho một chuỗi s, hãy kiểm tra xem chuỗi đó có phải là palindrome hay không.

Ví dụ 1:

Input: s = "A man, a plan, a canal: Panama"
Output: true

Giải thích
"amanaplanacanalpanama" là chuỗi palindrome.

Constraints

  • 1 <= s.length <= 2 * 10^5
  • s chỉ chứa các ký tự ASCII

Phân tích

  • Nhận thấy rằng palindrome là chuỗi có tính chất đặc biệt nên ta có thể sử dụng kỹ thuật two pointers để giải bài toán này.

Pseudocode

Funciton isPalindrome(s):
left = 0
right = s.length - 1
While left < right:
// Bỏ qua ký tự không phải là chữ cái hoặc số
While left < right AND NOT isAlphanumeric(s[left]):
left++
While left < right AND NOT isAlphanumeric(s[right]):
right--
// So sánh 2 ký tự
If toLowerCase(s[left]) != toLowerCase(s[right]):
Return false
left++
right--
Return true

Solution

class Solution {
public:
bool isPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while (left < right) {
while (left < right && !isalnum(s[left])) {
left++;
}
while (left < right && !isalnum(s[right])) {
right--;
}
if (tolower(s[left]) != tolower(s[right])) {
return false;
}
left++;
right--;
}
return true;
}
}