使用swift中的for循环检查字符串中的重复字符

时间:2017-07-03 21:17:10

标签: swift

我是使用while循环完成的,但我想知道是否有办法使用for循环。我试着把它写得很干净,所以我可以把它写在白板上供人们理解。

var str = "Have a nice day"

func unique(_ str: String) -> String {
var firstIndex = str.startIndex

while (firstIndex != str.endIndex) {
    var secondIndex = str.index(after: firstIndex)
    while (secondIndex != str.endIndex) {
        if (str[firstIndex] == str[secondIndex]) {
            return "Not all characters are unique"
        }
        secondIndex = str.index(after: secondIndex)
    }
    firstIndex = str.index(after: firstIndex)
}
return "All the characters are unique"
}

print("\(unique(str))")

5 个答案:

答案 0 :(得分:3)

您可以使用字符的索引:

var str = "Have a nice day"

func unique(_ str: String) -> String {
    for firstIndex in str.characters.indices {
        for secondIndex in str.characters.indices.suffix(from: str.index(after: firstIndex)) {
            if (str[firstIndex] == str[secondIndex]) {
                return "Not all characters are unique"
            }
        }
    }
    return "All the characters are unique"
}

print("\(unique(str))")

答案 1 :(得分:1)

以下是您问题的for循环版本。

let string = "Have a nice day"

func unique(_ string: String) -> String {
    for i in 0..<string.characters.count {
        for j in (i+1)..<string.characters.count {
            let firstIndex = string.index(string.startIndex, offsetBy: i)
            let secondIndex = string.index(string.startIndex, offsetBy: j)
            if (string[firstIndex] == string[secondIndex]) {
                return "Not all characters are unique"
            }
        }
    }
    return "All the characters are unique"
}

有很多方法可以实现,这只是一种方法。

答案 2 :(得分:0)

正如@adev所说,有很多方法可以完成此操作。例如,您只能在字典中使用一个for循环来检查字符串是否唯一:

时间复杂度:O(n)。字典需要O(n)额外的存储空间。

func unique(_ input: String) -> Bool {

    var dict: [Character: Int] = [:]

    for (index, char) in input.enumerated() {
        if dict[char] != nil { return false }
        dict[char] = index
    }

    return true

}

unique("Have a nice day") // Return false
unique("Have A_nicE-dⒶy") // Return true

答案 3 :(得分:0)

我用哈希来做到这一点。不知道它有多快,但就我而言并不需要。 (以我为例,我正在拨打电话,所以我先消除了破折号)

            let theLetters = t.components(separatedBy: "-")
            let justChars = theLetters.joined()
            var charsHash = [Character:Int]()
            justChars.forEach { charsHash[$0] = 1 }
            if charsHash.count < 2 { return false }

...或更紧凑,作为扩展...

extension String {
    var isMonotonous: Bool {
        var hash = [Character:Int]()
        self.forEach { hash[$0] = 1 }
        return hash.count < 2
    }
}

let a = "asdfasf".isMonotonous   // false
let b = "aaaaaaa".isMonotonous   // true

答案 4 :(得分:0)

这是我的解决方案

func hasDups(_ input: String) -> Bool {
    for c in input {
        if (input.firstIndex(of: c) != input.lastIndex(of: c)) {
            return true
        }
    }
    return false
}