美文网首页
LeetCode - 242. 有效的字母异位词

LeetCode - 242. 有效的字母异位词

作者: huxq_coder | 来源:发表于2020-09-02 09:27 被阅读0次

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

    示例 1:

    输入: s = "anagram", t = "nagaram"
    输出: true
    示例 2:

    输入: s = "rat", t = "car"
    输出: false
    说明:
    你可以假设字符串只包含小写字母。

    进阶:
    如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-anagram
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    算法

    /**
     暴力解法
     字符串 -> 有序字符数组,比较两个有序数组是否相等
     时间复杂度为O(nlogn)
     空间复杂度为O(n)
     */
    func isAnagram(_ s: String, _ t: String) -> Bool {
        // 转换为小写字母,排序
        let sArray = Array(s.lowercased()).sorted()
        let tArray = Array(t.lowercased()).sorted()
        // 判断转换后的两个数组是否相同
        return tArray.elementsEqual(sArray)
    }
    
    /**
     借助Dictionary
     遍历字符串,将字符作为key,出现的次数作为value保存到字典中
     最后比较两个字典是否相同
     时间复杂度为O(n)
     空间复杂度为O(n)
     */
    func isAnagram(_ s: String, _ t: String) -> Bool {
        if s.count != t.count {
            return false
        }
        var sMap: [Character: Int] = [:]
        var tMap: [Character: Int] = [:]
        // 遍历字符串,保存到字典中[字符: 出现的次数]
        for char in s {
            if sMap.keys.contains(char) {
                sMap[char] = sMap[char]! + 1
            } else {
                sMap[char] = 1
            }
        }
        for char in t {
            if tMap.keys.contains(char) {
                tMap[char] = tMap[char]! + 1
            } else {
                tMap[char] = 1
            }
        }
        return tMap == sMap
    }
    
    
    /**
     计数器
     利用一个字母表出现次数的计数数组
     第一个字符串出现的字母数量++
     第二个字符串出现的字母数量--
     最后数组中所有索引处的值都为0,true
     参考官方题解:https://leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode/
     时间复杂度为O(n)
     空间复杂度为O(n)
     */
    func isAnagram(_ s: String, _ t: String) -> Bool {
        if s.count != t.count {
            return false
        }
        // 26个英文字母,对应索引保存出现次数
        var alphabetCount = [Int](repeating: 0, count: 26)
        for char in s {
            alphabetCount[Int(char.asciiValue! - Character("a").asciiValue!)] += 1
        }
        for char in t {
            alphabetCount[Int(char.asciiValue! - Character("a").asciiValue!)] -= 1
        }
        for count in alphabetCount {
            if count != 0 {
                return false
            }
        }
        return true
    }
    
    
    /**
     在上一步的基础上参考提交记录中的算法优化
     */
    func isAnagram(_ s: String, _ t: String) -> Bool {
        if s.count != t.count {
            return false
        }
        var alphabetCount = [Int](repeating: 0, count: 26)
        let aScalarValue = "a".unicodeScalars.first!.value
        for scalar in s.unicodeScalars {
            alphabetCount[Int(scalar.value - aScalarValue)] += 1
        }
        for scalar in t.unicodeScalars {
            alphabetCount[Int(scalar.value - aScalarValue)] -= 1
        }
        for i in alphabetCount {
            if i != 0 {
                return false
            }
        }
        return true
    }
    
    
    /**
     提交记录中的算法
     时间复杂度为O(n)
     空间复杂度为O(1)
     */
    func isAnagram(_ s: String, _ t: String) -> Bool {
        if s.count != t.count {
            return false
        }
        var ans1: UInt32 = 1, ans2: UInt32 = 1
        var sum1: UInt32 = 0, sum2: UInt32 = 0
        for c in s.unicodeScalars {
            // 字符相同,取余避免越界
            ans1 = ans1*c.value % UInt32(100000)
            // 总数相同
            sum1 += c.value
        }
        for c in t.unicodeScalars {
            ans2 = ans2*c.value % UInt32(100000)
            sum2 += c.value
        }
        return ans1 == ans2 && sum1 == sum2
    }
    
    

    GitHub:https://github.com/huxq-coder/LeetCode
    欢迎star

    相关文章

      网友评论

          本文标题:LeetCode - 242. 有效的字母异位词

          本文链接:https://www.haomeiwen.com/subject/jreisktx.html