Skip to content

Commit 0318645

Browse files
authored
Merge pull request #1172 from delsint123/patch-1
Update 125-Valid-Palindrome.js
2 parents ad607dc + 2853ed9 commit 0318645

File tree

1 file changed

+57
-17
lines changed

1 file changed

+57
-17
lines changed

javascript/125-Valid-Palindrome.js

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +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) | 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) */
20+
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) */
925

10-
s = s.toLowerCase();
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;
1135

12-
return isValid(s);
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+
}
55+
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+
}
62+
63+
const getCodes = (s, left, right) => [ getCode(s[left]), getCode(s[right]) ];
64+
65+
const getCode = (char) => char.toLowerCase().charCodeAt(0);
66+
67+
const isAlphaNumeric = (char) => {
68+
const code = getCode(char);
69+
70+
const [ a, z ] = [ 97, 122 ];
71+
const isAlpha = (a <= code) && (code <= z);
3172

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)
73+
const [ zero, nine ] = [ 48, 57 ];
74+
const isNumeric = (zero <= code) && (code <= nine);
3575

36-
return isNonAlpha && isNonNumeric;
76+
return isAlpha || isNumeric;
3777
};

0 commit comments

Comments
 (0)