一、题目原型:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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
。