Skip to content

Commit 9d52d3e

Browse files
committed
solve: palindromic substrings
1 parent a093b40 commit 9d52d3e

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

palindromic-substrings/tolluset.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* TC: O(n)
3+
* SC: O(n)
4+
* */
5+
function countSubstrings(s: string): number {
6+
const t = "#" + s.split("").join("#") + "#";
7+
const n = t.length;
8+
const p = new Array(n).fill(0);
9+
let center = 0,
10+
right = 0,
11+
l = 0;
12+
13+
const mirror = (i: number, p: number[], c: number, r: number) => {
14+
return Math.min(r - i, p[c * 2 - i]);
15+
};
16+
17+
const isRightBound = (i: number, p: number[], n: number) => {
18+
return i + p[i] + 1 < n;
19+
};
20+
21+
const isLeftBound = (i: number, p: number[]) => {
22+
return i - p[i] - 1 >= 0;
23+
};
24+
25+
const isPalindrome = (i: number, p: number[], t: string) => {
26+
return t[i + p[i] + 1] === t[i - p[i] - 1];
27+
};
28+
29+
const isLongest = (i: number, p: number[], r: number) => {
30+
return i + p[i] > r;
31+
};
32+
33+
const calcTotal = (i: number, p: number[]) => {
34+
return Math.floor((p[i] + 1) / 2);
35+
};
36+
37+
for (let i = 0; i < n; i++) {
38+
if (i < right) {
39+
p[i] = mirror(i, p, center, right);
40+
}
41+
42+
while (
43+
isRightBound(i, p, n) &&
44+
isLeftBound(i, p) &&
45+
isPalindrome(i, p, t)
46+
) {
47+
p[i]++;
48+
}
49+
50+
if (isLongest(i, p, right)) {
51+
center = i;
52+
right = i + p[i];
53+
}
54+
55+
l += calcTotal(i, p);
56+
}
57+
58+
return l;
59+
}

0 commit comments

Comments
 (0)