Skip to content

Commit dee7d33

Browse files
authored
Create 2213-longest-substring-of-one-repeating-character.js
1 parent 0b760be commit dee7d33

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} queryCharacters
4+
* @param {number[]} queryIndices
5+
* @return {number[]}
6+
*/
7+
const longestRepeating = function(s, queryCharacters, queryIndices) {
8+
let n = queryCharacters.length
9+
const ans = []
10+
11+
const segmentTree = new SegmentTree(s)
12+
for (let i = 0; i < n; i++) {
13+
segmentTree.update(1, 0, s.length - 1, queryIndices[i], queryCharacters[i])
14+
ans.push(segmentTree.getMax())
15+
}
16+
17+
return ans
18+
};
19+
20+
class TreeNode {
21+
constructor(max, preStart, preEnd, sufStart, sufEnd) {
22+
this.max = max
23+
this.preStart = preStart
24+
this.preEnd = preEnd
25+
this.sufStart = sufStart
26+
this.sufEnd = sufEnd
27+
}
28+
}
29+
30+
class SegmentTree {
31+
constructor(s) {
32+
this.n = s.length
33+
this.s = s.split('')
34+
this.tree = new Array(4 * s.length)
35+
this.build(s, 1, 0, s.length - 1)
36+
}
37+
38+
build(s, treeIndex, left, right) {
39+
if (left === right) {
40+
this.tree[treeIndex] = new TreeNode(1, left, left, right, right)
41+
return
42+
}
43+
44+
let mid = left + Math.floor((right - left) / 2)
45+
this.build(s, treeIndex * 2, left, mid)
46+
this.build(s, treeIndex * 2 + 1, mid + 1, right)
47+
48+
this.tree[treeIndex] = this.merge(
49+
this.tree[treeIndex * 2],
50+
this.tree[treeIndex * 2 + 1],
51+
left,
52+
mid,
53+
right
54+
)
55+
}
56+
57+
update(treeIndex, left, right, index, val) {
58+
if (left === right) {
59+
this.tree[treeIndex] = new TreeNode(1, left, left, right, right)
60+
this.s[index] = val
61+
return
62+
}
63+
64+
let mid = left + Math.floor((right - left) / 2)
65+
if (mid < index) {
66+
this.update(treeIndex * 2 + 1, mid + 1, right, index, val)
67+
} else {
68+
this.update(treeIndex * 2, left, mid, index, val)
69+
}
70+
71+
this.tree[treeIndex] = this.merge(
72+
this.tree[treeIndex * 2],
73+
this.tree[treeIndex * 2 + 1],
74+
left,
75+
mid,
76+
right
77+
)
78+
}
79+
80+
merge(l, r, left, mid, right) {
81+
let max = Math.max(l.max, r.max)
82+
let preStart = l.preStart
83+
let preEnd = l.preEnd
84+
let sufStart = r.sufStart
85+
let sufEnd = r.sufEnd
86+
87+
if (this.s[mid] === this.s[mid + 1]) {
88+
max = Math.max(max, r.preEnd - l.sufStart + 1)
89+
if (l.preEnd - l.preStart + 1 === mid - left + 1) {
90+
preEnd = r.preEnd
91+
}
92+
if (r.sufEnd - r.sufStart + 1 === right - mid) {
93+
sufStart = l.sufStart
94+
}
95+
}
96+
97+
return new TreeNode(max, preStart, preEnd, sufStart, sufEnd)
98+
}
99+
100+
getMax() {
101+
return this.tree[1].max
102+
}
103+
}
104+
105+

0 commit comments

Comments
 (0)