数据结构和算法分析算法提高之LeetCode刷题

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

2018-09-26  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读