代码编织梦想

前言

本题为 LeetCode 前 100 高频题

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新了 78 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:中等

1. 描述

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

2. 示例

示例 1

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

约束条件:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

3. 答案

class WordSearch {
    func exist(board: [[Character]], _ word: String) -> Bool {
        guard board.count > 0 && board[0].count > 0 else {
            return false
        }
        
        let m = board.count
        let n = board[0].count
        var visited = Array(count: m, repeatedValue: Array(count: n, repeatedValue: false))
        var wordContent = [Character](word.characters)
        
        for i in 0..<m {
            for j in 0..<n {
                if board[i][j] == wordContent[0] && _dfs(board, wordContent, m, n, i, j, &visited, 0) {
                    return true
                }
            }
        }
        
        return false
    }
    
    private func _dfs(board: [[Character]], _ wordContent: [Character], _ m: Int, _ n: Int, _ i: Int, _ j: Int, inout _ visited: [[Bool]], _ index: Int) -> Bool {
        if index == wordContent.count {
            return true
        }
    
        guard i >= 0 && i < m && j >= 0 && j < n else {
            return false
        }
        guard !visited[i][j] && board[i][j] == wordContent[index] else {
            return false
        }
        
        visited[i][j] = true
        
        if _dfs(board, wordContent, m, n, i + 1, j, &visited, index + 1) || _dfs(board, wordContent, m, n, i - 1, j, &visited, index + 1) || _dfs(board, wordContent, m, n, i, j + 1, &visited, index + 1) || _dfs(board, wordContent, m, n, i, j - 1, &visited, index + 1) {
            return true
        }
        visited[i][j] = false
        
        return false
    }
}
  • 主要思想:经典深度优先搜索,上,下,左,右四个方向。
  • 时间复杂度: O(mn * 4^(k - 1)), m和n分别代表矩阵的宽和高,k为单词大小
  • 空间复杂度: O(mn)

该算法题解的仓库:LeetCode-Swift

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。

后续还会翻译大量资料到我们公众号,有感兴趣的朋友,可以加入我们。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36478920/article/details/127156344

leetcode刷题指南_mmc2015的博客-爱代码爱编程_如何刷leetcode

参考:https://blog.csdn.net/qq_39521554/article/details/79160815   二、刷题方法 方法一:按照题目出现频率刷题 顺序参考文章最后的部分 方法二:标签法 按照网站给大家排列的不同tags,起到模块化的复习和学习作用。举个例子:比如复习链表的内容,就选Linked List这部分的23个题目

leetcode top100题目和答案(java完整版 面试必备)-爱代码爱编程

二刷完剑指Offer后又刷了一遍Leetcode Top 100专栏的题目,听说基本上能涵盖面试的算法题,总体来说收获还是很大的,下面贴出答案,又不懂的可以给我留言,博主会及时解答。 我的github 准备把春招复习的知识都

swift算法:字符串相乘_style_月月的博客-爱代码爱编程_swift 乘法

1、描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回num1 和 num2 的乘积,它们的乘积也表示为字符串形式 例1:       输入:num1 = "2", num2="3"       输出:"6" 例2:       输入:num1 = "123", num = "456"       输出:"56088"

LeetCode——对角线遍历(之字形遍历)-爱代码爱编程

索引和为{偶}数,向上遍历,{横}索引值递减,遍历值依次是(x,0),(x-1,1),(x-2,2),…,(0,x) 索引和为{奇}数,向下遍历,{纵}索引值递减,遍历值依次是(0,y),(1,y-1),(2,y-2),…,(y,0) 题目:https://leetcode-cn.com/explore/featured/card/array-and-s

Leetcode top100题目及解答代码 (Python)-爱代码爱编程

代码 代码放置在github中:https://github.com/isthegoal/leetcode_top125  使用了大量注释进行了题目 方案的解读。(类似形式如下) 题目 1 两数之和 42.20% Easy 2 两数相加 30.70% Medium 3 无重复字符的最长子串 28.00% Medium 4 寻找两

LeetCode(top100)在排序数组中查找元素的第一个和最后一个位置-爱代码爱编程

在排序数组中查找元素的第一个和最后一个位置 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 题目分析 输入: nums = [5,7,7,8,8,10], targe

LeetCode股票问题系列通解-爱代码爱编程

🍁说明 原文出处:股票问题 🌸前言 股票问题一共有六道题,链接如下: 121.买卖股票的最佳时机122.买卖股票的最佳时机 II123. 买卖股票的最佳时机 III124.买卖股票的最佳时机 IV125.最佳买卖股票时机含冷冻期126.买卖股票的最佳时机含手续费每个问题都有优质的题解,但是大多数题解没有建立起这些问题之间的联系,也没有给出股票问题系

LeetCode 文本左右对齐-爱代码爱编程

给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,

LeetCode - #5 求最长的镜像字符串-爱代码爱编程

前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤道长)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新了 3 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积

【Swift】LeetCode搜索插入位置-爱代码爱编程

由于各大平台的算法题的解法很少有Swift的版本,小编这边将会出个专辑为手撕LeetCode算法题。新手撕算法。 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums = [1,3,5,6],

539.最小时间差-LeetCode-爱代码爱编程

难度:中等 目录 一、问题描述 二、解题思想  三、解题 1、判断极端情况 2、代码实现 一、问题描述 这里我直接采用的LeetCode上面的问题描述。         给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。 下面给出示例:         提示:

【Leetcode刷题笔记 持续更新】热题TOP100篇-爱代码爱编程

3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 思路: 最长,最大问题其实通常都会想到的是动态规划,而动态规划最开始都是由dp数组来实现的,但是通常在优化算法的时候dp算法都会被优化成几个变量,这其实也就可以看作是滑动窗口。 这个题是要求找出最长字串的长度,那么dp数组dp[i]表示的是截止到i处,最

leetcode(力扣) 539. 最小时间差 (模拟时间)-爱代码爱编程

文章目录 题目描述思路分析完整代码 题目描述 给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。 示例 1: 输入:timePoints = [“23:59”,“00:00”] 输出:1 示例 2: 输入:timePoints = [“00:00”,

CodeTop035 爬楼梯-爱代码爱编程

爬楼梯 假设你正在爬楼梯.需要n阶你才能到达楼顶。每次你可以爬1或2个台阶.你有多少种不同的方法可以爬到楼顶呢? 这题典型的动态规划,easyyyyyyy题.关键是后面的几种变形题. public static int climbStairs(int n) { if (n<3) return n; in

leetcode 52. N皇后 II-爱代码爱编程

leetcode 52. N皇后 II N 皇后问题, 简单来说就是:同一行,同一列,同一斜线上,只能存在一个皇后。 搜索策略:每行只放一个皇后,搜索第 i 个皇后可以放在第 i 行的第几列(需要枚举每一列), 放好第 i 个皇后, 才去放第 i+1 个皇后, 直到放完所有皇后。 定义:`f[i]` 代表 第 i 个皇后放置在 第 i 行 第 `f[

leetcode top100题单_大唐雨夜的博客-爱代码爱编程

文章目录 [1]两数之和 52.4% Easy 0.0%[2]两数相加 41.6% Medium 0.0%[3]无重复字符的最长子串 38.8% Medium 0.0%[4]寻找两个正序数组的中位数 41.4% Hard 0.0%[5]最长回文子串 36.7% Medium 0.0%[10]正则表达式匹配 31.6% Hard 0.0%[11]盛最

【leetcode 第二轮刷题日记】leetcodetop100+高频题整理_leetcode top100-爱代码爱编程

目录 前言一些笔记链表笔记树笔记 一、链表篇(14)1.1、删除链表元素LeetCode237. 删除链表中的节点( 腾讯)LeetCode19. 删除链表的倒数第 N 个结点( ⭐️⭐️⭐️高频、剑指I