毕业_设计 2022-01-28 09:29 采纳率: 100%
浏览 25
已结题

用java解决单词搜索问题

单词搜索
给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。

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

示例 1:

输入:

board = [
["o","a","a","n"],
["e","t","a","e"],
["i","h","k","r"],
["i","f","l","v"]
], 
words = ["oath","pea","eat","rain"]

输出:["eat","oath"]
示例 2:

输入:board = [
["a","b"],
["c","d"]
],
words = ["abcb"]
输出:[]
提示:

m == board.length
n == board[i].length
1 <= m, n <= 12
board[i][j] 是一个小写英文字母
1 <= words.length <= 3 * 10^4
1 <= words[i].length <= 10
words[i] 由小写英文字母组成
words 中的所有字符串互不相同

  • 写回答

1条回答 默认 最新

  • 易小侠 C/C++领域新星创作者 2022-01-28 09:33
    关注
    
    class Solution {
        static int[][] d = new int[][] { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
        static Map<String, Boolean> notExistWords = new HashMap<>();
        public List<String> findWords(char[][] board, String[] words) {
            List<String> ans = new ArrayList<>();
            Arrays.sort(words);
            notExistWords.clear();
            for (int i = 0; i < words.length; i++) {
                String word = words[i];
                if (i > 0 && word.equals(words[i - 1]))
                    continue;
                boolean notExistFlag = false;
                for (int j = 1; j < word.length(); j++) {
                    if (notExistWords.containsKey(word.substring(0, j + 1))) {
                        notExistFlag = true;
                        break;
                    }
                }
                if (notExistFlag)
                    continue;
                if (exist(board, word)) {
                    ans.add(word);
                } else {
                    notExistWords.put(word, false);
                }
            }
            return ans;
        }
        public boolean exist(char[][] board, String word) {
            int m = board.length;
            if (m == 0)
                return false;
            int n = board[0].length;
            if (n == 0)
                return false;
            if (word.equals(""))
                return true;
            boolean[][] f = new boolean[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (word.charAt(0) == board[i][j]) {
                        f[i][j] = true;
                        boolean flag = dfs(i, j, 1, board, word, m, n, f);
                        if (flag)
                            return true;
                        f[i][j] = false;
                    }
                }
            }
            return false;
        }
        private boolean dfs(int i, int j, int k, char[][] board, String word, int m, int n, boolean[][] f) {
            if (k == word.length()) {
                return true;
            }
            for (int l = 0; l < 4; l++) {
                if (i + d[l][0] < m && j + d[l][1] < n && i + d[l][0] >= 0 && j + d[l][1] >= 0
                        && board[i + d[l][0]][j + d[l][1]] == word.charAt(k) && !f[i + d[l][0]][j + d[l][1]]) {
                    f[i + d[l][0]][j + d[l][1]] = true;
                    boolean flag = dfs(i + d[l][0], j + d[l][1], k + 1, board, word, m, n, f);
                    if (flag)
                        return true;
                    f[i + d[l][0]][j + d[l][1]] = false;
                }
            }
            return false;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月5日
  • 已采纳回答 1月28日
  • 创建了问题 1月28日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。