一、題目原型:
給定兩個(gè)字符串 s 和 t ,編寫一個(gè)函數(shù)來(lái)判斷 t 是否是 s 的一個(gè)字母異位詞。
二、示例剖析:
示例 1:
輸入: s = "anagram", t = "nagaram"
輸出: true
示例 2:
輸入: s = "rat", t = "car"
輸出: false
說(shuō)明:
你可以假設(shè)字符串只包含小寫字母。
進(jìn)階:
如果輸入字符串包含 unicode 字符怎么辦?你能否調(diào)整你的解法來(lái)應(yīng)對(duì)這種情況?
三、解題思路:
1.第一想到的就是排下序,然后比對(duì)。
func isAnagram(_ s: String, _ t: String) -> Bool {
if s.count != t.count {
return false
}
if s.sorted() == t.sorted() {
return true
}
return false
}
2.用ASCII碼
func isAnagram(_ s: String, _ t: String) -> Bool {
if s.count != t.count {
return false
}
var counter_s = Array.init(repeating: 0, count: 26)
var counter_t = Array.init(repeating: 0, count: 26)
var char_s = s.cString(using: String.Encoding.utf8)
var char_t = t.cString(using: String.Encoding.utf8)
// 因?yàn)?cString方法默認(rèn)會(huì)在末尾加上空字符,ASCII碼為0
// 所以需要將其刪除
char_s?.removeLast()
char_t?.removeLast()
for char in char_s! {
let index = Int(char - 97)
counter_s[index] += 1
}
for char in char_t! {
let index = Int(char - 97)
counter_t[index] += 1
}
print(char_s,char_t)
return counter_s == counter_t
}
3.用ASCII碼,.unicodeScalars方法,省去了刪除最后的空字符的操作
func isAnagram(_ s: String, _ t: String) -> Bool {
if s.count != t.count {
return false
}
var counter_s = Array.init(repeating: 0, count: 26)
var char_s = s.unicodeScalars
for char in char_s {
let index = Int(char.value - 97)
counter_s[index] += 1
}
var counter_t = Array.init(repeating: 0, count: 26)
var char_t = t.unicodeScalars
for char in char_t {
let index = Int(char.value - 97)
counter_t[index] += 1
}
print(char_s,char_t)
return counter_s == counter_t
}
四、小結(jié)
1.耗時(shí)524毫秒,超過(guò)16.13%的提交記錄,總提交數(shù)34。
2.耗時(shí)148毫秒,超過(guò)70.97%的提交記錄,總提交數(shù)34。
3.耗時(shí) 44 毫秒,超過(guò)93.55%的提交記錄,總提交數(shù)34。
個(gè)人博客地址