前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift 有效的字母异位词 - LeetCode

Swift 有效的字母异位词 - LeetCode

作者头像
韦弦zhy
发布2018-09-11 12:46:28
9060
发布2018-09-11 12:46:28
举报

LeetCode.jpg

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

案例1:

代码语言:javascript
复制
输入: s = "anagram", t = "nagaram"
输出: true

案例2:

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

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

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

代码一、
代码语言:javascript
复制
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,所以大写字母也是可以的,然后这个方法可以适应进阶问题的解答,比如:

代码语言:javascript
复制
isAnagram("anagram?", "nagaram?")
//true

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

提交记录如下:

image.png

所以下面我们同样使用Swift 字符串中的第一个唯一字符 - LeetCode中的方案二解题如下:

代码二、
代码语言:javascript
复制
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,中有:

代码语言:javascript
复制
Each UnicodeScalar has a value property that returns the scalar’s 21-bit value, represented within a UInt32 value:

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

代码三、
代码语言:javascript
复制
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字符了

代码语言:javascript
复制
isAnagram2("anagrAm?", "nAgaram?")
//true
提交记录如下:

image.png

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目:有效的字母异位词
    • 描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
      • 说明:你可以假设字符串只包含小写字母。
        • 进阶:如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
          • 解题思路:
            • 代码一、
              • 提交记录如下:
                • 代码二、
                  • 提交记录如下:
                    • 代码三、
                      • 提交记录如下:
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档