Skip to content

Commit

Permalink
Update 125-Valid-Palindrome.js
Browse files Browse the repository at this point in the history
  • Loading branch information
aakhtar3 authored Sep 23, 2022
1 parent 5ae7247 commit 2853ed9
Showing 1 changed file with 55 additions and 32 deletions.
87 changes: 55 additions & 32 deletions javascript/125-Valid-Palindrome.js
Original file line number Diff line number Diff line change
@@ -1,54 +1,77 @@
/**
* Array - Filter && Clone && Reverse
* Time O(N) | Space O(N)
* https://leetcode.com/problems/valid-palindrome/
* Time O(N^2) | Space O(1)
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function (s) {
var isPalindrome = function(s) {
if (!s.length) return true;

const alphaNumeric = filterAlphaNumeric(s);/* Time O(N) | Space O(N) */
const reversed = reverse(alphaNumeric); /* Time O(N) | Space O(N) */

return alphaNumeric === reversed;
};

const filterAlphaNumeric = (s, nonAlphaNumeric = new RegExp('[^a-z0-9]','gi')) => s
.toLowerCase() /* Time O(N) | Space O(N) */
.replace(nonAlphaNumeric, '')/* Time O(N) | Space O(N) */

s = s.toLowerCase();
const reverse = (s) => s
.split('')/* Time O(N) | Space O(N) */
.reverse()/* Time O(N) | Space O(N) */
.join('');/* Time O(N) | Space O(N) */

return isValid(s);
/**
* 2 Pointer | Midde Convergence
* Time O(N) | Space O(1)
* https://leetcode.com/problems/valid-palindrome/
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if (!s.length) return true;

return isValid(s);/* Time O(N) */
};

const isValid = (s) => {
let [left, right] = [0, s.length - 1];
let [ left, right ] = [ 0, (s.length - 1) ];

while (left < right) {
while (left < right && isNonAlphaNumeric(s[left])) left++;
while (left < right && isNonAlphaNumeric(s[right])) right--;
while (left < right) { /* Time O(N) */
[ left, right ] = moveToMid(s, left, right);/* Time O(N) */

const isSame = s[left] === s[right];
if (!isSame) return false;
const [ leftCode, rightCode ] = getCodes(s, left, right);

const isEqual = leftCode === rightCode;
if (!isEqual) return false;

left++;
right--;
left++; right--;
}

return true;
};
}

const isNonAlphaNumeric = (char) => {
const isNonAlpha = char < 'a' || 'z' < char; // a(97) - z(122)
const isNonNumeric = char < '0' || '9' < char; // 0(48) - 9(57)
const moveToMid = (s, left, right) => {
while ((left < right) && !isAlphaNumeric(s[left])) left++; /* Time O(N) */
while ((left < right) && !isAlphaNumeric(s[right])) right--;/* Time O(N) */

return [ left, right ];
}

return isNonAlpha && isNonNumeric;
};
const getCodes = (s, left, right) => [ getCode(s[left]), getCode(s[right]) ];

/**
* https://leetcode.com/problems/valid-palindrome/
* Time O(N) | Space O(N)
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if (!s.length) return true;

s = s.toLowerCase();
s = s.replace(/[^a-z0-9]/gi, '');

let reversed = s.split('').reverse().join('');
const getCode = (char) => char.toLowerCase().charCodeAt(0);

const isAlphaNumeric = (char) => {
const code = getCode(char);

return reversed === s;
const [ a, z ] = [ 97, 122 ];
const isAlpha = (a <= code) && (code <= z);

const [ zero, nine ] = [ 48, 57 ];
const isNumeric = (zero <= code) && (code <= nine);

return isAlpha || isNumeric;
};

0 comments on commit 2853ed9

Please sign in to comment.