--- 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; }; ```