题目:有效的字母异位词
描述:给定两个字符串 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中开始做初级算法这一章节,将做的题目在此做个笔记吧。
网友评论