387. 字符串中的第一个唯一字符

作者: 花果山松鼠 | 来源:发表于2018-09-26 17:43 被阅读6次

    一、题目原型:

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
    注意事项:您可以假定该字符串只包含小写字母。

    二、示例剖析:

    s = "leetcode"
    返回 0.
    
    s = "loveleetcode",
    返回 2.
    

    三、解题思路:

    用ASCII码来判断,因为一个字符对应唯一的一个ASCII码。由于题目可以假定只包含小写字母,我们范围就可缩小至小写字母这一块:97~122。
    用一个count=27的数组,所有元素初始化都为0。如果ASCII码出现一次,该元素就+1;如果重复出现多次,该元素就会>1。所以我们只需要拿到最后的==1的元素就行。取它的i值。

    let allLowerLetters: [Int8]? = "abcdefghijklmnopqrstuvwxyz".cString(using: String.Encoding.utf8)
    // 小写字母ASCII码为:97~122
    
    func firstUniqChar(_ s: String) -> Int {
        // 1.先将字符串转换成ASCII码数组
        let chars: [Int8]? = s.cString(using: String.Encoding.utf8)
        var ret: Int = -1
        var last: [Int] = Array.init(repeating: 0, count: 27)
        
        if s.count > 0 {
            
            for i in 0..<s.count {
                let hash_i: Int = Int(chars![i])
                let hash_a: Int = 97
                last[hash_i - hash_a] = last[hash_i - hash_a] + 1
            }
            
            for i in 0..<s.count {
                let hash_i: Int = Int(chars![i])
                let hash_a: Int = 97
                if last[hash_i - hash_a] == 1 {
                    ret = i
                    break
                }
            }
        }
        return ret
    }
    

    四、小结

    1.耗时188毫秒,超过96.94%的提交记录,总提交数104

    相关文章

      网友评论

        本文标题:387. 字符串中的第一个唯一字符

        本文链接:https://www.haomeiwen.com/subject/tcdjoftx.html