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

242. 有效的字母异位词

2018-09-27  本文已影响3人  花果山松鼠

一、题目原型:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。

二、示例剖析:

 示例 1:
 输入: s = "anagram", t = "nagaram"
 输出: true
 
 示例 2:
 输入: s = "rat", t = "car"
 输出: false
 
 说明:
 你可以假设字符串只包含小写字母。
 
 进阶:
 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

三、解题思路:

1.第一想到的就是排下序,然后比对。

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)
    // 因为.cString方法默认会在末尾加上空字符,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
}

四、小结

1.耗时524毫秒,超过16.13%的提交记录,总提交数34
2.耗时148毫秒,超过70.97%的提交记录,总提交数34
3.耗时 44 毫秒,超过93.55%的提交记录,总提交数34

上一篇下一篇

猜你喜欢

热点阅读