LeetCode之HOT100--049 字母异位词分组

156 阅读1分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

前言

一直都计划学习数据结构与基本算法,但是平时都看一阵停一阵。现在决心坚持下去,我准备从LeetCode的HOT100开始,每天完成1~2道习题,希望通过这种方式养成持续学习的习惯。最近在学习Swift,所以本系列的题解都将使用swift语言完成,本文更新的是LeetCode中HOT100的第23题049 字母异位词分组。

题目

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词:是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。 

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母

分析

字母异位词:是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次,即字母相同,但排列不同的字符串。所以字母异位词在排序后就是相同的,本题解利用这一点进行解题。 因为要将数组中相同的字母异位词进行归类,所以本题解中借助字典来进行临时保存,key为相同字母异位词排序后的字符串,value为对应的异位词的数组。最后再将字典中所有的value进行整理到一个结果数组中。具体步骤如下:

1、创建可变空字典resultDic = [String:[String]](),用来保存字母异位词的分类结果
2、对数组中的字符串依次进行如下处理
  2.1 对当前字符串curStr进行排序后生成对应的排序串sortStr
  2.2 如果结果字典resultDic中不存在key为sortStr的键值对,则创建key为sortStr,value为包含curStr的单元素数组
  2.3 如果结果字典resultDic中存在key为sortStr的键值对,则将curStr添加到key为sortStr对应的value数组中
3、将结果字典resultDic中所有的value进行整理到一个结果数组中 进行返回

题解

class KLLC049 {
    func groupAnagrams(_ strs: [String]) -> [[String]] {
        if strs.count <= 1 {
            return [strs]
        }
        //创建可变空字典,用来保存字母异位词的分类结果
        var resultDic = [String:[String]]()
        for curStr in strs { //遍历处理数组中的每一个字符串
            //对curStr进行排序,拿到对应的排序串sortStr
            let sortStr = String(curStr.sorted())
            
            if resultDic[sortStr] == nil {
                //结果字典中不存在sortStr时,添加
                resultDic[sortStr] = [curStr]
            } else {
                ////存在sortStr时,添加到value数组中
                var lastArr : [String] = resultDic[sortStr]!
                lastArr.append(curStr)
                resultDic[sortStr] = lastArr
            }
        }
        //将结果字典resultDic中所有的value进行整理到一个结果数组
        var result = [[String]]()
        for value in resultDic.values {
            result.append(value)
        }
        
        return result

    }
}