Files
leetcode/apps/docs/content/(01-linear-structures)/two-pointers/125_valid-palindrome.mdx
T

82 lines
2.4 KiB
Plaintext

---
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
icon: dot
topics:
- { name: "Two Pointers", slug: "two-pointers" }
- { name: "String", slug: "string" }
video: "jJXJ16kPFWg"
issue: "https://github.com/prdlk/leetcode/issues/41"
companies:
- { name: "tcs", period: "Thirty Days", frequency: 58.2 }
- { name: "Meta", period: "Thirty Days", frequency: 53.8 }
- { name: "Amazon", period: "Thirty Days", frequency: 39.1 }
- { name: "Google", period: "Thirty Days", frequency: 29 }
- { name: "Bloomberg", period: "Three Months", frequency: 79.9 }
- { name: "Infosys", period: "Three Months", frequency: 66 }
- { name: "Microsoft", period: "Three Months", frequency: 42.1 }
- { name: "Deloitte", period: "Six Months", frequency: 81 }
- { name: "Cognizant", period: "Six Months", frequency: 76.3 }
- { name: "Axon", period: "Six Months", frequency: 75.4 }
- { name: "Apple", period: "Six Months", frequency: 64.8 }
sidebar:
label: 'Valid Palindrome'
badge: 'Easy'
---
### 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;
};
```