import Foundation
// Remove last n occurrences of a substring
func removeLastNOccurrences(_ s: String, sub: String, n: Int) -> String {
var positions: [String.Index] = []
var searchStart = s.startIndex
// Find all occurrences
while let range = s.range(of: sub, range: searchStart..<s.endIndex) {
positions.append(range.lowerBound)
searchStart = range.upperBound
}
// Remove from the end
var result = s
var remaining = n
for pos in positions.reversed() {
if remaining == 0 { break }
let end = result.index(pos, offsetBy: sub.count)
result.removeSubrange(pos..<end)
remaining -= 1
}
return result
}
// Remove extra spaces (collapse multiple spaces, trim ends)
func removeExtraSpaces(_ s: String) -> String {
s.split(whereSeparator: { $0.isWhitespace })
.joined(separator: " ")
}
let text = "abc xyz xyz abc xyzabcxyz abc"
let result = removeLastNOccurrences(text, sub: "xyz", n: 3)
print(result)
let cleaned = removeExtraSpaces(result)
print(cleaned)
/*
run:
abc xyz abc abc abc
abc xyz abc abc abc
*/