LeetCode solutions算法提高之LeetCode刷题Swift in LeetCode

Swift 有效的字母异位词 - LeetCode

2018-07-25  本文已影响5人  韦弦Zhy
LeetCode.jpg

题目:有效的字母异位词

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

案例1:

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

案例2:

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

就是对字母异位词的理解,意思就是两个单词的组成字符是一样的

那么题目就变成了判读两个字符串的组成元素是否是一样的,我们用两个数组获取字符串的所有组成元素,然后排序后比较是否相等:

代码一、

func isAnagram(_ s: String, _ t: String) -> Bool {
    
    var sArr = [String]()
    for character in s { //将字符串转为数组
        sArr.append(String(character))
    }
    
    var tArr = [String]()
    for character in t { //将字符串转为数组
        tArr.append(String(character))
    }
    
    return sArr.sorted() == tArr.sorted()
}

因为Swift字符串就是unicode,所以大写字母也是可以的,然后这个方法可以适应进阶问题的解答,比如:

isAnagram("anagram😁", "nagaram😁")
//true

这里其实用到的解决方案和Swift 字符串中的第一个唯一字符 - LeetCode中的方案一一致,但是也同样导致耗时较多。

提交记录如下:
image.png
所以下面我们同样使用Swift 字符串中的第一个唯一字符 - LeetCode中的方案二解题如下:
代码二、
func isAnagram1(_ s: String, _ t: String) -> Bool {
    
    //创建一个含有26个为0的值的数组
    var sArr = Array<Int>(repeating: 0, count: 26)
    for character in s.unicodeScalars {
        
        let index = Int(character.value - 97)
        //记录字符出现的次数
        sArr[index] = sArr[index] + 1
    }
    
    //创建一个含有26个为0的值的数组
    var tArr = Array<Int>(repeating: 0, count: 26)
    for character in t.unicodeScalars {
        let index = Int(character.value - 97)
        //记录字符出现的次数
        tArr[index] = tArr[index] + 1
    }
    
    return sArr == tArr
}

提交记录如下:
image.png
运行效率可谓是坐上了火箭,但是现在还不支持大写字母以及Uinicode
同样考官方网String and Characters,中有:
Each UnicodeScalar has a value property that returns the scalar’s 21-bit value, represented within a UInt32 value:

这么一段话,那么我们可以获取到value,然后结合方案一解题。

代码三、
func isAnagram2(_ s: String, _ t: String) -> Bool {
    
    var sArr = [UInt32]()
    for character in s.unicodeScalars {
        
        sArr.append(character.value)
    }
    
    var tArr = [UInt32]()
    for character in t.unicodeScalars {
       tArr.append(character.value)
    }
    
    return sArr.sorted() == tArr.sorted()
}

此时便支持大写字符和所有unicode字符了

isAnagram2("anagrAm😁", "nAgaram😁")
//true
提交记录如下:
image.png

可以看到执行用时比方案一少,但是比方案二多了不少,但是与方案一一样都支持Unicode。

用Swift开始学习算法中,在LeetCode中开始做初级算法这一章节,将做的题目在此做个笔记吧。

上一篇下一篇

猜你喜欢

热点阅读