使用Swift查找字符串中的第一个非重复字符

问题描述 投票:0回答:4

这会找到数组中的重复项,但是我正在寻找可以找到字符串中第一个非重复字符的东西。我一直在试图找到一种方法来做,但我无法解决。这是我最近得到的。

var strArray = ["P","Q","R","S","T","P","R","A","T","B","C","P","P","P","P","P","C","P","P","J"]

println(strArray)

var filter = Dictionary<String,Int>()
var len = strArray.count
for var index = 0; index < len  ;++index {
var value = strArray[index]
if (filter[value] != nil) {
    strArray.removeAtIndex(index--)
    len--
}else{
    filter[value] = 1
}
}
println(strArray)
swift
4个回答
5
投票

为了判断字符是否重复,请遍历整个数组一次,增加字典中出现的次数:

let characters = ["P","Q","R","S","T","P","R","A","T","B","C","P","P","P","P","P","C","P","P","J"]

var counts: [String: Int] = [:]
for character in characters {
    counts[character] = (counts[character] ?? 0) + 1
}


let nonRepeatingCharacters = characters.filter({counts[$0] == 1})
// ["Q", "S", "A", "B", "J"]
let firstNonRepeatingCharacter = nonRepeatingCharacters.first!
// "Q"

1
投票
func firstNonRepeatedCharacter(input: String) -> Character?{
    var characterCount : [Character : Int] = [:]
    var uniqueCharacter: Character?

    for character in input{
        if let count = characterCount[character]{
            characterCount[character] = count + 1
            if(uniqueCharacter == character)
            {
                uniqueCharacter = nil
            }
        }
        else{
            characterCount[character] = 1
            if(uniqueCharacter == nil){
                uniqueCharacter = character
            }
        }
    }
    return uniqueCharacter
}

没有多余的循环来从characterCount字典中查找字符


0
投票

这是我发现来检测第一个非重复字符的方法。它删除空格和标点符号以查找不重复的实际字母或数字。

extension String {

func removeNonAlphaNumChars() -> String {
    let charSet = NSCharacterSet.alphanumericCharacterSet().invertedSet

    return self
        .componentsSeparatedByCharactersInSet(charSet)
        .joinWithSeparator("")
}

var firstNonRepeatedCharacter: Character? {
    let alphaNumString = self.removeNonAlphaNumChars()

    let characters = alphaNumString.characters
    let count = characters.count
    guard count > 0 else { return nil }

    // Find unique chars
    var dict: [Character: Int?] = [:]
    for (index, char) in characters.enumerate() {
        if dict[char] != nil {
            dict[char] = (nil as Int?)
        }
        else {
            dict[char] = index
        }
    }

    return dict.filter { $0.1 != nil }.sort { $0.1 < $1.1 }.first?.0
}
}

0
投票

我完全不知道为什么接受的答案被认为是正确的。他们正在使用

.first

字典的方法,根据文档的说明,它将在字典中返回一个随机元素,而不是第一个元素,因为swift中的字典没有像数组那样排序。check the image to see dictionary as an unordered collection

请在下面找到有效的实现

func firstNonRepeatingLetter(_ str: String)  -> String{
   var characterDict = [String : Int]()

   for character in str{
       let lower = character.lowercased()
       if let count = characterDict[lower]{
         characterDict[lower] = count + 1
       }else{
        characterDict[lower] = 1
       }
   }

   let filtered = characterDict.filter { $0.value == 1}
   for character in str{
       let lower = character.lowercased()
       if let _ = filtered[lower]{
        return lower
       }
   }

   return ""
}


firstNonRepeatingLetter("moonmen") would return "e". 
© www.soinside.com 2019 - 2024. All rights reserved.