Skip to content

Commit 2853ed9

Browse files
authored
Update 125-Valid-Palindrome.js
1 parent 5ae7247 commit 2853ed9

File tree

1 file changed

+55
-32
lines changed

1 file changed

+55
-32
lines changed

javascript/125-Valid-Palindrome.js

Lines changed: 55 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,77 @@
11
/**
2+
* Array - Filter && Clone && Reverse
3+
* Time O(N) | Space O(N)
24
* https://leetcode.com/problems/valid-palindrome/
3-
* Time O(N^2) | Space O(1)
45
* @param {string} s
56
* @return {boolean}
67
*/
7-
var isPalindrome = function (s) {
8+
var isPalindrome = function(s) {
89
if (!s.length) return true;
10+
11+
const alphaNumeric = filterAlphaNumeric(s);/* Time O(N) | Space O(N) */
12+
const reversed = reverse(alphaNumeric); /* Time O(N) | Space O(N) */
13+
14+
return alphaNumeric === reversed;
15+
};
16+
17+
const filterAlphaNumeric = (s, nonAlphaNumeric = new RegExp('[^a-z0-9]','gi')) => s
18+
.toLowerCase() /* Time O(N) | Space O(N) */
19+
.replace(nonAlphaNumeric, '')/* Time O(N) | Space O(N) */
920

10-
s = s.toLowerCase();
21+
const reverse = (s) => s
22+
.split('')/* Time O(N) | Space O(N) */
23+
.reverse()/* Time O(N) | Space O(N) */
24+
.join('');/* Time O(N) | Space O(N) */
1125

12-
return isValid(s);
26+
/**
27+
* 2 Pointer | Midde Convergence
28+
* Time O(N) | Space O(1)
29+
* https://leetcode.com/problems/valid-palindrome/
30+
* @param {string} s
31+
* @return {boolean}
32+
*/
33+
var isPalindrome = function(s) {
34+
if (!s.length) return true;
35+
36+
return isValid(s);/* Time O(N) */
1337
};
1438

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

18-
while (left < right) {
19-
while (left < right && isNonAlphaNumeric(s[left])) left++;
20-
while (left < right && isNonAlphaNumeric(s[right])) right--;
42+
while (left < right) { /* Time O(N) */
43+
[ left, right ] = moveToMid(s, left, right);/* Time O(N) */
2144

22-
const isSame = s[left] === s[right];
23-
if (!isSame) return false;
45+
const [ leftCode, rightCode ] = getCodes(s, left, right);
46+
47+
const isEqual = leftCode === rightCode;
48+
if (!isEqual) return false;
2449

25-
left++;
26-
right--;
50+
left++; right--;
2751
}
2852

2953
return true;
30-
};
54+
}
3155

32-
const isNonAlphaNumeric = (char) => {
33-
const isNonAlpha = char < 'a' || 'z' < char; // a(97) - z(122)
34-
const isNonNumeric = char < '0' || '9' < char; // 0(48) - 9(57)
56+
const moveToMid = (s, left, right) => {
57+
while ((left < right) && !isAlphaNumeric(s[left])) left++; /* Time O(N) */
58+
while ((left < right) && !isAlphaNumeric(s[right])) right--;/* Time O(N) */
59+
60+
return [ left, right ];
61+
}
3562

36-
return isNonAlpha && isNonNumeric;
37-
};
63+
const getCodes = (s, left, right) => [ getCode(s[left]), getCode(s[right]) ];
3864

39-
/**
40-
* https://leetcode.com/problems/valid-palindrome/
41-
* Time O(N) | Space O(N)
42-
* @param {string} s
43-
* @return {boolean}
44-
*/
45-
var isPalindrome = function(s) {
46-
if (!s.length) return true;
47-
48-
s = s.toLowerCase();
49-
s = s.replace(/[^a-z0-9]/gi, '');
50-
51-
let reversed = s.split('').reverse().join('');
65+
const getCode = (char) => char.toLowerCase().charCodeAt(0);
66+
67+
const isAlphaNumeric = (char) => {
68+
const code = getCode(char);
5269

53-
return reversed === s;
70+
const [ a, z ] = [ 97, 122 ];
71+
const isAlpha = (a <= code) && (code <= z);
72+
73+
const [ zero, nine ] = [ 48, 57 ];
74+
const isNumeric = (zero <= code) && (code <= nine);
75+
76+
return isAlpha || isNumeric;
5477
};

0 commit comments

Comments
 (0)