【Swift】LeetCode 438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词

题目描述

思路 and Swift 题解

使用 Swift 重新解这道题目的时候卡了我一段时间,发现我之前使用 C++ 和 Go 解这道题目的时候的思路过于复杂了,因此好好整理分析一下这道题目。

这道题目要找出的是字符串s当中的子串的开始下标,这些子串满足其中出现字母的个数与p字符串当中字母出现的次数相同。根据这个条件,我们自然想到应该使用字典来对字符串出现的次数进行存储。与 Golang 不同的是,Swift 的两个字典可以直接进行相等比较,当两个字典当中 Key / Value 完全相同时,这两个字典就是相同的(Golang 当中的 map 只能和 map 的零值 nil 进行比较)。

因此,我们需要先维护一个关于字符串p的字典mp,它的类型是[Character: Int],因此,我们需要先将String类型的字符串p转为[Character]。之后,将p字符串当中的字符出现次数维护到到mp当中。

现在我们需要做的就是维护关于s子串当中字符出现频率的字典ms。由于子串必须是连续的,并且长度不会比p更长,因此我们只需要维护字符串p长度m的滑动窗口即可。每次我们需要判断左侧的字符是否已经落入了窗口之外,如果是的话就需要将这个字符出现的频率-1。如果这个字符出现的频率为0,就需要将ms当中它的出现频率设为nil(原因是msmp进行比较时,Key / Value 需要完全相同,Value 为0和 Value 为nil是不同的)。

如果滑动窗口的大小大于等于m,就可以开始判断是否存在答案了。如果ms == mp,就将滑动窗口的左侧索引加入到答案当中。

完整的 Swift 题解是:

swift 复制代码
class Solution {
    func findAnagrams(_ s: String, _ p: String) -> [Int] {
        var chars = Array(s), charp = Array(p)
        var ms = [Character: Int](), mp = [Character: Int]()

        for i in 0..<charp.count {
            mp[charp[i], default: 0] += 1
        }

        var ans = [Int]()
        var n = chars.count, m = charp.count
        for i in 0..<n {
            ms[chars[i], default: 0] += 1

            if i >= m {
                var leftChar = chars[i - m]
                ms[leftChar, default: 0] -= 1

                if ms[leftChar] == 0 {
                    ms[leftChar] = nil
                }
            }

            if i >= m - 1 && ms == mp {
                ans.append(i - m + 1)
            }
        }

        return ans
    }
}
相关推荐
人月神话-Lee10 分钟前
【图像处理】Sobel 边缘检测——让机器“看见“轮廓
图像处理·人工智能·计算机视觉·ios·ai编程·swift
songgeb8 小时前
Swift Optional几个名词备忘
swift
sakiko_1 天前
Swift学习笔记31-网络请求
网络·笔记·学习·swift
人月神话-Lee3 天前
【图像处理】高斯模糊——最优雅的模糊算法
图像处理·人工智能·算法·ios·ai编程·swift
Daniel_Coder3 天前
iOS Widget 开发-20:从旧版 API 迁移到 iOS 17+ 现代 Widget
ios·swift·widget·widgetcenter
Daniel_Coder3 天前
iOS Widget 开发-19:Widget 调试与单元测试
ios·单元测试·swift·widget·widgetcenter
Daniel_Coder4 天前
iOS Widget 开发-18:Widget 的 SwiftUI 视图适配与设计
ios·swiftui·swift·widget·widgetcenter
Daniel_Coder4 天前
iOS Widget 开发-17:Widget 错误处理与空状态设计
ios·swift·widget·widgetcenter
wjm0410064 天前
简单谈谈ios开发中的UI
开发语言·ios·swift
hhb_6184 天前
Swift核心技术难点与实战案例解析
开发语言·ios·swift