leetcode之wordsearch

Problem

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given board =

[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

word = “ABCCED”, -> returns true,

word = “SEE”, -> returns true,

word = “ABCB”, -> returns false.

思考

自己考慮採用map記錄每個位置的字母,遍歷給定的單詞字符,比較每個位置是否是相鄰。但是不同位置可以出現相同字母,就比較棘手。

又想構建樹,一個單詞就是一條樹中的一條路徑。但是跟節點無法確定,如果遍歷board每個節點都構造樹,未免太麻煩。

Solution

boolean exist(char[][] board, String word) {
        char[] w = word.toCharArray();
        for (int y = 0; y < board.length; y++) {
            for (int x = 0; x < board[y].length; x++) {
                if (exist(board, y, x, w, 0))
                    return true;
            }
        }
        return false;
    }

    private boolean exist(char[][] board, int y, int x, char[] word, int i) {
        if (i == word.length) return true;
        if (y < 0 || x < 0 || y == board.length || x == board[y].length) return false;
        if (board[y][x] != word[i]) return false;
        board[y][x] ^= 256;
        boolean exist = exist(board, y, x + 1, word, i + 1)
                || exist(board, y, x - 1, word, i + 1)
                || exist(board, y + 1, x, word, i + 1)
                || exist(board, y - 1, x, word, i + 1);
        board[y][x] ^= 256;
        return exist;
    }

查看了leetcode大神的解答。用了遞歸。

這裏比較巧妙的是board[y][x] ^= 256;,利用異或操作爲爲每個位置的char記錄是否被訪問。字母的ascii碼小於128,這裏異或256即10000000,異或0即是本身,所以低位沒變,但是高位改變,沒有字母能和異或後的結果相等,也就達到了記錄是否被訪問的效果,節省空間還方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章