---
title: '125. Valid Palindrome'
description: A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers
sidebar:
  label: 'Valid Palindrome'
  badge: 'Easy'
---

Two Pointers

### Example 1:
- Input: `s = "A man, a plan, a canal: Panama"`
- Output: `true`
- Explanation: `"amanaplanacanalpanama"` is a palindrome.

### Example 2:
- Input: `s = "race a car"`
- Output: `false`
- Explanation: `"raceacar"` is not a palindrome.

### Example 3:
- Input: `s = " "`
- Output: `true`
- Explanation: `s` is an empty string `""` after removing non-alphanumeric characters. Since an empty string reads the same forward and backward, it is a palindrome.

### Constraints:

- `1 <= s.length <= 2 * 10^5`
- `s` consists only of printable ASCII characters.

## Approach

```mermaid
flowchart TD
  S(["isPalindrome(s)"]) --> N["normal = s stripped of non-alphanumerics, lowercased"]
  N --> I["i = 0, j = normal.length - 1"]
  I --> W{"i < j?"}
  W -- no --> E(["return true — the pointers met in the middle"])
  W -- yes --> Q{"normal[i] != normal[j]?"}
  Q -- yes --> F(["return false"])
  Q -- no --> A["i++; j-- — step both inward"]
  A --> W
```

## Solution

```js
/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
  let normal = s.replace(/[^a-zA-Z0-9]/g, "").toLowerCase()    
  let i = 0, j = normal.length - 1;

  while (i < j) {
    if(normal[i] !== normal[j]) {
      return false;
    }
    i++;
    j--;
  }
  return true;
};
```

## Explanation

[Valid Palindrome - Leetcode 125 - Python](https://www.youtube.com/watch?v=jJXJ16kPFWg)
