删除String中所有两次重复字符的方法

时间:2016-10-30 15:59:10

标签: ios swift string character

我编写了一个删除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)

2 个答案:

答案 0 :(得分:2)

您的代码中存在两个问题,例如

  • 删除tempString中的字符后,索引indexindex2将长引用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
}