-
Notifications
You must be signed in to change notification settings - Fork 0
/
Add Bold Tag in String.kt
65 lines (50 loc) · 2.03 KB
/
Add Bold Tag in String.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class Solution {
fun addBoldTag(s: String, words: Array<String>): String {
val finalIntervals: MutableList<Pair<Int, Int>> = mutableListOf()
for (word in words) {
finalIntervals.addAll(getIntervals(s, word))
}
val sortedIntervals = finalIntervals.sortedBy { it.first }
val intervals = mergeIntervals(sortedIntervals).map {
listOf(it.first, it.second)
}
val stringArray = s.toCharArray().map { it -> it.toString() }.toTypedArray()
for (interval in intervals) {
stringArray[interval[0]] = "<b>" + stringArray[interval[0]]
stringArray[interval[1]] = stringArray[interval[1]] + "</b>"
}
return stringArray.joinToString("")
}
private fun mergeIntervals(intervals: List<Pair<Int, Int>>): List<Pair<Int, Int>> {
val results: MutableList<Pair<Int, Int>> = mutableListOf()
for (interval in intervals) {
if (results.size == 0) {
results.add(interval)
} else {
val lastInterval = results.last()
if ((interval.first <= lastInterval.second) ||
interval.first - lastInterval.second == 1) {
val newInterval = lastInterval.first to maxOf(interval.second, lastInterval.second)
results[results.lastIndex] = newInterval
} else {
results.add(interval)
}
}
}
return results
}
private fun getIntervals(word: String, search: String): List<Pair<Int, Int>> {
var searchIndex = 0
var offset = 0
val results: MutableList<Pair<Int, Int>> = mutableListOf()
while (searchIndex != -1) {
searchIndex = word.indexOf(search, offset)
if (searchIndex != -1) {
val lastIndex = searchIndex + search.length - 1
results.add(searchIndex to lastIndex)
offset++
}
}
return results
}
}