我编写了一个删除String中所有2个重复字符的方法,例如
我只需删除包含两次的char,例如
“bndkss” - > “bndk”
“nnmmhj” - > “HJ”
“aaabbaac” - > “ac
“abba” - > “”
我在objc上写道并且一切正常,但是Swift没有工作,请帮忙,我哪里出错?
override func viewDidLoad() {
super.viewDidLoad()
let string = "baab"
print("before: \(string)")
let stringAfter = checkString(string: string)
print("after: \(stringAfter)")
}
func checkString(string : String) -> String {
var tempString = string
for (index, element) in string.characters.enumerated() {
for (index2, element2) in string.characters.enumerated() {
if element == element2 && index != index2 {
if index > index2 {
tempString.remove(at: tempString.index(tempString.startIndex, offsetBy: index))
tempString.remove(at: tempString.index(tempString.startIndex, offsetBy: index2))
} else {
tempString.remove(at: tempString.index(tempString.startIndex, offsetBy: index2))
tempString.remove(at: tempString.index(tempString.startIndex, offsetBy: index))
}
if tempString.characters.count < 1 {
return ""
} else {
checkString(string: tempString)
}
} else {
if index == tempString.characters.count - 1 && index2 == tempString.characters.count - 1 {
return tempString
}
}
}
}
return ""
}
更新: 只需要
return checkString(string: tempString)
代替
checkString(string: tempString)
答案 0 :(得分:2)
您的代码中存在两个问题,例如
tempString
中的字符后,索引index
和index2
将长引用tempString
中的原始字符。
结果会删除错误的字符。checkString()
但丢弃结果。 更新:正如您在此期间已经注意到的那样,return checkString(string: tempString)
解决了这些问题。
这是另一种实现方式。想法是使用字典 记住最后一个角色的位置和索引集 它跟踪人物的位置 保存。而不是两个嵌套循环和递归,两个“简单” 这里使用循环,加上字典和设置操作的成本。
func removeDuplicateCharacters(string: String) -> String {
var seen = [Character: Int]()
var keep = IndexSet(integersIn: 0..<string.characters.count)
for (idx, c) in string.characters.enumerated() {
if let prevIndex = seen[c] {
keep.remove(prevIndex)
keep.remove(idx)
seen.removeValue(forKey: c)
} else {
seen[c] = idx
}
}
return String(keep.map { string[string.index(string.startIndex, offsetBy: $0)] })
}
示例:
print(removeDuplicateCharacters(string: "bndkss")) // ""bndk"
print(removeDuplicateCharacters(string: "nnmmhj")) // "jh"
print(removeDuplicateCharacters(string: "abba")) // ""
print(removeDuplicateCharacters(string: "aaabbaac")) // "ac"
答案 1 :(得分:0)
Martin写了一个比我自己更清洁的版本,但是我对此工作了一段时间,所以我想我会发布它以向你展示它本可以实现的另一种方式。
func removeDuplicates(from original: String) -> String {
var originalString = original
var newString = ""
for character in originalString.characters {
if !newString.contains("\(character)") {
newString.append(character)
originalString = originalString.characters.filter { $0.description != "\(character)" }.map { "\($0)" }.joined(separator: "")
} else {
newString = newString.characters.filter { $0.description != "\(character)" }.map { "\($0)" }.joined(separator: "")
}
}
return newString
}