一、題目原型:
給定一個(gè)字符串,找到它的第一個(gè)不重復(fù)的字符,并返回它的索引。如果不存在,則返回 -1。
注意事項(xiàng):您可以假定該字符串只包含小寫(xiě)字母。
二、示例剖析:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
三、解題思路:
用ASCII碼來(lái)判斷,因?yàn)橐粋€(gè)字符對(duì)應(yīng)唯一的一個(gè)ASCII碼。由于題目可以假定只包含小寫(xiě)字母,我們范圍就可縮小至小寫(xiě)字母這一塊:97~122。
用一個(gè)count=27的數(shù)組,所有元素初始化都為0。如果ASCII碼出現(xiàn)一次,該元素就+1;如果重復(fù)出現(xiàn)多次,該元素就會(huì)>1。所以我們只需要拿到最后的==1的元素就行。取它的i值。
let allLowerLetters: [Int8]? = "abcdefghijklmnopqrstuvwxyz".cString(using: String.Encoding.utf8)
// 小寫(xiě)字母ASCII碼為:97~122
func firstUniqChar(_ s: String) -> Int {
// 1.先將字符串轉(zhuǎn)換成ASCII碼數(shù)組
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
}
四、小結(jié)
1.耗時(shí)188毫秒,超過(guò)96.94%的提交記錄,總提交數(shù)104。
個(gè)人博客地址