楼主: IAMKEVINNIU
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 求解一个DFS题(谜之Bug)

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
题目:给一个grid(char[][])和一个word(String),在grid中找的这个word,并返回word的每个letter在grid中的位置。
example:
input:
        char[][] grid = {
                {'c', 'r', 'c', 'a', 'r', 's'},
                {'a', 'b', 'i', 't', 'n', 'b'},
                {'t', 'f', 'n', 'n', 't', 'i'},
                {'x', 's', 'i', 'i', 'p', 't'}
        };

        String word = "catnip";

output:
[0, 2]
[0, 3]
[1, 3]
[2, 3]
[3, 3]
[3, 4]
我的解法如下:
为什么找到第一个p之后,不会回到i,而是继续从p开始找了?
  1. public class CheatingWord {
  2.     public static void main(String[] args) throws Exception {
  3.         char[][] grid = {
  4.                 {'c', 'r', 'c', 'a', 'r', 's'},
  5.                 {'a', 'b', 'i', 't', 'n', 'b'},
  6.                 {'t', 'f', 'n', 'n', 't', 'i'},
  7.                 {'x', 's', 'i', 'i', 'p', 't'}
  8.         };

  9.         String word = "catnip";
  10.         CheatingWord cw = new CheatingWord();
  11.         cw.cheatingWord(word, grid);
  12.     }

  13.     public int[][] dirs = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};

  14.     public void cheatingWord(String word, char[][] grid) throws Exception {
  15.         if (word == null || word.length() == 0) {
  16.             throw new IllegalArgumentException("No word found!");
  17.         }
  18.         if (grid == null || grid.length == 0 || grid[0].length == 0) {
  19.             throw new IllegalArgumentException("Invalid grid!");
  20.         }

  21.         List<List<int[]>> res = new ArrayList<>();
  22.         List<int[]> list = new ArrayList<>();

  23.         for (int i = 0; i < grid.length; i++) {
  24.             for (int j = 0; j < grid[0].length; j++) {
  25.                 dfs(word, grid, i, j, list, res, 0);
  26.                 if (res.size() > 0) {
  27.                     break;
  28.                 }
  29.             }
  30.             if (res.size() > 0) {
  31.                 break;
  32.             }
  33.         }
  34.         System.out.println(1);
  35.     }

  36.     private void dfs(String word, char[][] grid, int i, int j, List<int[]> list, List<List<int[]>> res, int index) {
  37.         if (index == word.length()) {
  38.             res.add(new ArrayList<>(list));
  39.             return;
  40.         }

  41.         if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) {
  42.             return;
  43.         }

  44.         if (word.charAt(index) != grid[i][j]) {
  45.             return;
  46.         }

  47.         char temp = grid[i][j];
  48.         grid[i][j] = '#';

  49.         for (int k = 0; k < dirs.length; k++) {
  50.             list.add(new int[]{i, j});
  51.             dfs(word, grid, i + dirs[k][0], j + dirs[k][1], list, res, index + 1);
  52.             list.remove(list.size() - 1);
  53.         }

  54.         grid[i][j] = temp;
  55.     }
  56. }
复制代码

[/i][/i][/i][/i]

上一篇:一天能想出4到hard题是什么水平
下一篇:请问有同学能帮忙发下LC近6个月狗家,亚麻,FB还有微软的高频题吗?
全局:
看不到全部的code,没明白楼主说的bug是什么,但有可能bug出在“list”这个variable上?每次进入dfs的时候,“list”应该是空的
回复

使用道具 举报

🔗
 楼主| IAMKEVINNIU 2020-9-5 22:40:03 | 只看该作者
全局:
miluChen 发表于 2020-9-5 22:09
看不到全部的code,没明白楼主说的bug是什么,但有可能bug出在“list”这个variable上?每次进入dfs的时候 ...

code的话,往下拉就能看到。
不好意思,我可能没讲清楚。
我重新讲一下:
这里dfs我是想把word在grid中的位置存到res中。按照example,我search到'p'的时候代表已经找到了个符合要求的list,我就放到res里面,然后return回递归的上一层。但是上一层不应该是'i'吗?我这里的bug是没有返回到递归的上一层,仍然留在'p'了。
回复

使用道具 举报

🔗
 楼主| IAMKEVINNIU 2020-9-5 22:42:41 | 只看该作者
全局:
miluChen 发表于 2020-9-5 22:09
看不到全部的code,没明白楼主说的bug是什么,但有可能bug出在“list”这个variable上?每次进入dfs的时候 ...

不知道我讲清楚了吗...
如果你方便的话,也可以加个w为x新语音聊一下,你可以把w为x新发我(七九四把四流二思琪),当交个题友啦哈哈。
回复

使用道具 举报

🔗
tamu123 2020-9-6 03:12:25 | 只看该作者
全局:
当你search到p的时候 你的index 是5 你的word_length是6 并不满足line 43 的条件

所以当你在p时,你还会继续search 四个方向,并且你的res里会有4 个相同的结果。

评分

参与人数 1大米 +3 收起 理由
IAMKEVINNIU + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
phantom 2020-9-6 03:21:28 | 只看该作者
全局:
  1.         for (int k = 0; k < dirs.length; k++) {
  2.             list.add(new int[]{i, j});
  3.             dfs(word, grid, i + dirs[k][0], j + dirs[k][1], list, res, index + 1);
  4.             list.remove(list.size() - 1);
  5.         }
复制代码


dfs函数如果当前list是catni,到grid 有p这个字符的时候,每个方向都会push一次结果吧?

相当于
  1.         for (int k = 0; k < dirs.length; k++) {
  2.             list.add(new int[]{i, j});  // List is position for c, a, t, n, i. Trying to add position for p
  3.             dfs(word, grid, i + dirs[k][0], j + dirs[k][1], list, res, index + 1); // dfs will return immediately while adding list to res
  4.             list.remove(list.size() - 1); // Remove position for p, but loop will run 4 times (all directions)
  5.         }
复制代码

评分

参与人数 1大米 +2 收起 理由
IAMKEVINNIU + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
landshark 2020-9-6 07:02:36 | 只看该作者
全局:
像是leetcode #79 的翻版题, 可以参考leetcode的答案

评分

参与人数 1大米 +3 收起 理由
IAMKEVINNIU + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
landshark 2020-9-6 07:06:41 | 只看该作者
全局:
本帖最后由 landshark 于 2020-9-6 07:07 编辑

提供一下我的解法,作为参考

  1. class Solution:
  2.     # @param board, a list of lists of 1 length string
  3.     # @param word, a string
  4.     # @return a boolean
  5.     def exist(self, board, word):
  6.         # edge case
  7.         if not board:
  8.             return False
  9.         board = [list(x) for x in board]
  10.         indexes = []
  11.         for i in range(len(board)):
  12.             for j in range(len(board[i])):
  13. [/i]               if self._exist(board, i, j, word, 0, indexes):
  14.                     print(indexes)
  15.                     return True
  16.         return False

  17.     def _exist(self, board, i, j, word, k, indexes):
  18.         '''Judge if word in (i, j) matches'''
  19.         # out of bound
  20. [i]        if i == len(board) or i == -1 or j == -1 or j == len(board):
  21.             return False

  22.         temp = board[j]
  23.         
  24.         if temp == '*': # already visited
  25.             return False
  26.         
  27.         if not temp == word[k]:
  28.             return False

  29.         if k == len(word) -1 :
  30.             return True

  31.         board[j] = '*'
  32.         indexes.append((i, j))
  33.         if self._exist(board, i+1, j, word, k+1, indexes) or \
  34.             self._exist(board, i-1, j, word, k+1, indexes) or \
  35.             self._exist(board, i, j-1, word, k+1, indexes) or \
  36.             self._exist(board, i, j+1, word, k+1, indexes):
  37.             return True

  38.         board[j] = temp
  39.         indexes.pop()
  40.         return False
  41.         
  42.         
复制代码
[/i]
回复

使用道具 举报

🔗
 楼主| IAMKEVINNIU 2020-9-6 11:16:47 | 只看该作者
全局:
landshark 发表于 2020-9-6 07:02
像是leetcode #79 的翻版题, 可以参考leetcode的答案

谢谢,这题我是有做过。我的解法也是一个思路,但是还是有点小问题。不过fixed了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表