func removeDuplicateLetters(_ s: String) -> String {
if s.characters.count == 0 {
return ""
}
let aNum = Int("a".unicodeScalars.filter{$0.isASCII}.map{$0.value}.first!)
let characters = Array(s.lowercased().characters)
var counts = [Int](repeatElement(0, count: 26))
var visited = [Bool](repeatElement(false, count: 26))
var stack = [Character]()
var i = 0
for character in characters {
if let num = asciiValueOfCharacter(character) {
counts[num - aNum] += 1
}
}
for character in characters {
if let num = asciiValueOfCharacter(character) {
i = num - aNum
counts[i] -= 1
if visited[i] {
continue
}
while !stack.isEmpty, let peekNum = asciiValueOfCharacter(stack.last!), num < peekNum && counts[peekNum - aNum] != 0 {
visited[peekNum - aNum] = false
stack.removeLast()
}
stack.append(character)
visited[i] = true
}
}
return String(stack)
}
func asciiValueOfCharacter(_ character: Character) -> Int? {
let value = String(character).unicodeScalars.filter{$0.isASCII}.first?.value ?? 0
return Int(value)
}
6条答案
按热度按时间xxls0lw81#
编辑/更新:* * Swift 4.2或更高版本**
可以使用集过滤重复字符:
或者作为
RangeReplaceableCollection
上的扩展,也将扩展String和Substring:x一个一个一个一个x一个一个二个x
sz81bmfz2#
我将使用another answer of mine中的这段代码,它删除序列的所有重复项(只保留每个重复项的第一次出现),同时保持顺序。
然后,我会用某种逻辑将它 Package 起来,将String转换成一个序列(通过获取它的
characters
),取消它,然后将结果恢复成一个字符串:ojsjcaue3#
这是我在网上找到的一个解决方案,但我不认为它是最佳的。
pokxtpni4#
下面是使用reduce()执行此操作的一种方法,
正如Leo所建议的,这里是同一方法的一个简短版本,
pes8fvy95#
只是另一种解决方案
6tdlim6h6#
使用筛选器和包含删除重复值