В настоящее время я работаю над алгоритмом для поиска всех диапазонов целевой строки.
Пример:
Input: s = "acfacfacf", target = "acf"
Output: [(0, 3), (3, 6), (6, 9)]
Note: the upperBound is not an index of the subarray.
Это мое текущее решение:
extension String {
func allRanges(of string: String) -> [(Int, Int)] {
var ranges = [(Int, Int)]()
var set: Set<Int> = []
let chars = Array(self)
let target = Array(string)
for index in 0..<chars.count {
if chars[index] == string.first { set.insert(index) }
for i in set {
if index-i < target.count && chars[index] == target[index-i] {
if index-i == target.count-1 {
ranges += [(i, index+1)]
}
} else {
set.remove(i)
}
}
}
return ranges
}
}
Этот алгоритм хорошо работает со строками типа «acfacfacf», но плохо работает со строками типа «аааааааааааааааа», где целью является «аааааааа», и ожидаемый результат:
[(0, 8), (1, 9), (2, 10), (3, 11), (4, 12), (5, 13), (6, 14), (7, 15), (8, 16), (9, 17)]
Есть ли какие-либо оптимизации, которые можно сделать здесь?
Изменить: Также. Я понимаю, что использование кортежей здесь не очень похоже на Swifty, но это не самая большая моя проблема.