【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(原因是ms和mp进行比较时,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
    }
}
相关推荐
茶底世界之下21 小时前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift
xbzb1 天前
Swift 对象存储建环实验 + Ceilometer 计量:两个收尾服务
swift·ring·实验·ceilometer·象存储·建环
2501_916008891 天前
iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_915918411 天前
iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送
vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子1 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
人工智能·swiftui·swift
2501_916007473 天前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
00后程序员张3 天前
Windows 开发 iOS App 入门,用 SwiftUI 写第一个 iOS App 装到 iPhone
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
andyweike4 天前
Swift
开发语言·ios·swift
静以修身zzz4 天前
OpenStack对象存储-Swift、OpenStack编排管理-heat、OpenStack网络管理-neutron
linux·运维·服务器·架构·openstack·swift
瓦瓦gogo5 天前
第一次了解 iOS 开发:从 Swift、SwiftUI 到公共组件
ios·swiftui·swift