Swift 有效的字母异位词 - LeetCode

作者: 韦弦Zhy | 来源:发表于2018-07-25 16:26 被阅读5次
    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中开始做初级算法这一章节,将做的题目在此做个笔记吧。

    相关文章

      网友评论

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

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