Published on

2025-01-06

Authors
  • Name
    Twitter

2025-01-06

准备坚持刷一下leetcode

最近看youtube上的一个叫土妹的博主4年前的视频,我发现热爱分享的人坚持下去人生轨迹真的会不一样。 她最开始的时候就是分享如何去刷leetcode的。 我自己也注册过leetcode的帐号,但是一刷题就会有很大的挫败感,当时自己还很完主义。觉得自己不行。其实听了土妹的分享后,还来再聪明的人遇到自己不熟悉的领域的时候都是这样的。没有人是天才,可以从0-100,都是先从0-1,然后再慢慢积累上来的。你所看到的那些天才,只不过是人家刚好比你先掌握这些知识罢了。 做任何事情,我们都要有从零开始的决心和勇气,和良好的心态。 能够克服自己的完美主义,就是一大胜利。

准备去快速刷一个leetcode啦,等我的好消息。

我回来了,真的是这样,我拿到了一个题目,完全不会,有的思路也只是暴力解法。 https://leetcode.cn/problems/MPnaiL/

leetcode

class Solution {
    func checkInclusion(_ s1: String, _ s2: String) -> Bool {
        //边界检查
        if s1.count > s2.count {
            return false
        } else {
            let permutations = self.permutations(s1)
            var isExit: Bool = false
            for permutation in permutations {
                if s2.contains(permutation) {
                    isExit = true
                    break
                }
            }
            return isExit
        }

        //s1的变位词
    }

    func permutations(_ s1: String) -> [String] {
    // 如果字符串为空,返回空数组
        guard !s1.isEmpty else { return [] }
        
        // 转换为字符数组
        let characters = Array(s1)
        
        // 用于存储结果的数组
        var result: [String] = []
        
        // 递归函数生成全排列
        func backtrack(_ current: [Character], _ remaining: [Character]) {
            // 如果剩余字符为空,将当前排列加入结果
            if remaining.isEmpty {
                result.append(String(current))
                return
            }
            
            // 遍历剩余字符,生成排列
            for i in 0..<remaining.count {
                var nextCurrent = current
                var nextRemaining = remaining
                nextCurrent.append(remaining[i])  // 添加当前字符
                nextRemaining.remove(at: i)      // 移除当前字符
                backtrack(nextCurrent, nextRemaining)
            }
        }
        
        // 初始调用
        backtrack([], characters)
        return result
    }


}

ChatGpt解法

class Solution {
    func checkInclusion(_ s1: String, _ s2: String) -> Bool {
        let s1Count = s1.count
        let s2Count = s2.count

        // 如果 s1 比 s2 长,则不可能包含其变位词
        if s1Count > s2Count {
            return false
        }

        // 将字符串转换为字符数组
        let s1Array = Array(s1)
        let s2Array = Array(s2)

        // 创建字符频率计数器,假设只有小写字母
        let aAscii = Int(Character("a").asciiValue!)
        var s1Frequency = [Int](repeating: 0, count: 26)
        var windowFrequency = [Int](repeating: 0, count: 26)

        // 统计 s1 的字符频率
        for char in s1Array {
            s1Frequency[Int(char.asciiValue!) - aAscii] += 1
        }

        // 初始化滑动窗口的字符频率(前 s1Count 个字符)
        for i in 0..<s1Count {
            windowFrequency[Int(s2Array[i].asciiValue!) - aAscii] += 1
        }

        // 滑动窗口
        for i in 0...(s2Count - s1Count) {
            // 如果窗口频率和 s1 频率匹配,则找到变位词
            if windowFrequency == s1Frequency {
                return true
            }
            
            // 滑动窗口:移除前一个字符,添加下一个字符
            if i + s1Count < s2Count {
                let removeIndex = Int(s2Array[i].asciiValue!) - aAscii
                let addIndex = Int(s2Array[i + s1Count].asciiValue!) - aAscii
                windowFrequency[removeIndex] -= 1
                windowFrequency[addIndex] += 1
            }
        }

        return false
    }
}

最终,chatGpt给了我一个完美的解法,其中用到的思想是滑动窗口。等记录下来,不要太完美的一次解题,只需要去做,去经历。

今日分享

2024 年对你我影响最大的一本书应该是斯蒂芬·盖斯的《如何成为不完美主义者》,我的大部分行动力不足,拖延等都来源于完美主义。给我带来的变化是让我上线了自己的第一个apple store的app,说来惭愧,我是 2012 就开始ios开发的。2025 的一个想法就是用这本书的思想来打造一个app,做自己需要的工具。