zoukankan      html  css  js  c++  java
  • Leetcode 79 单词搜索

    Leetcode 79 单词搜索

    1. 题目

    79. 单词搜索

    给定一个二维网格和一个单词,找出该单词是否存在于网格中。

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

    示例:
    
    board =
    [
      ['A','B','C','E'],
      ['S','F','C','S'],
      ['A','D','E','E']
    ]
    
    给定 word = "ABCCED", 返回 true
    给定 word = "SEE", 返回 true
    给定 word = "ABCB", 返回 false
    

    提示:

    board 和 word 中只包含大写和小写英文字母。
    1 <= board.length <= 200
    1 <= board[i].length <= 200
    1 <= word.length <= 10^3
    

    2. 代码

    class Solution {
    public:
        bool exist(vector<vector<char>>& board, string word) {
            int n = board.size();
            int m = board[0].size();
            for(int i = 0; i<n; ++i){
                for(int j = 0; j<m; ++j){
                    if(board[i][j] == word[0] && dfs(i, j, board, word, 0)){
                        return true;
                    }
                }
            }
            return false;
        }
    private:
        bool dfs(int x, int y, vector<vector<char>>& board, string& word, int index){
            int n = board.size();
            int m = board[0].size();
     
            if(x<0 || x>=n || y<0 || y>=m || board[x][y] != word[index]){
                return false;
            }
            if(index == word.size() - 1){
                return true;
            }
            char c = board[x][y];
            board[x][y] = '';
            if(dfs(x + 1, y, board, word, index + 1) 
                    || dfs(x - 1, y, board, word, index + 1)
                    || dfs(x, y + 1, board, word, index + 1)
                    || dfs(x, y - 1, board, word, index + 1)){
                return true;
            }
            board[x][y] = c;
            return false;   
        }
    };
    
    
    

    3. 思路

    感觉思路很简单,这里贴一下修改过程。本来交上是60ms 很慢,后面改成了24ms。

    60ms优化到24ms的心得:

    1. 去掉循环,直接四个方向用||连接判断
    2. 不用used,在原board上修改(当然这样不一定规范
    3. 结束条件放到检查边界后面,因为结束条件true的次数很少,放前面开销大
    4. 使用if(dfs()) return true;这种模式,可以节约flag变量

    不过我还是觉得,代码过于简洁并不是好事,可能刷题显得很酷,但是没用。需要在过度冗余和过度简洁中间找一个平衡点,兼具性能、可读性、可维护性的代码才是好代码。

  • 相关阅读:
    BZOJ1076 [SCOI2008]奖励关 概率 状态压缩动态规划
    BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划
    洛谷1623 树的匹配 树形动态规划 高精度
    BZOJ1053 [HAOI2007]反素数ant 数论
    Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划
    网络流24题 第五题
    网络流24题 第四题
    网络流24题 第三题
    网络流24题 第二题
    网络流24题 第一题
  • 原文地址:https://www.cnblogs.com/molinchn/p/13663198.html
Copyright © 2011-2022 走看看