欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?Java算法之單詞搜索示例詳解

 更新時間:2022年08月23日 10:18:30   作者:黃丫丫  
這篇文章主要為大家介紹了Go?Java算法之單詞搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

單詞搜索

給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。

  • 示例 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

board 和 word 僅由大小寫英文字母組成  

算法:DFS回溯(Java)

  • 以"SEE"為例,首先要選起點:遍歷矩陣,找到起點S。
  • 起點可能不止一個,基于其中一個S,看看能否找出剩下的"EE"路徑。
  • 下一個字符E有四個可選點:當前點的上、下、左、右。
  • 逐個嘗試每一種選擇?;诋斍斑x擇,為下一個字符選點,又有四種選擇。
  • 每到一個點做的事情是一樣的。DFS 往下選點,構建路徑。
  • 當發(fā)現(xiàn)某個選擇不對,不用繼續(xù)選下去了,結束當前遞歸,考察別的選擇。

遞歸的關鍵點

  • 關注當前考察的點,處理它,其他丟給遞歸子調用去做。
  • 判斷當前選擇的點,本身是不是一個錯的點。
  • 剩下的字符能否找到路徑,交給遞歸子調用去做。
  • 如果當前點是錯的,不用往下遞歸了,返回false。否則繼續(xù)遞歸四個方向,為剩下的字符選點。

那么,哪些情況說明這是一個錯的點:

  • 當前的點,越出矩陣邊界。
  • 當前的點,之前訪問過,不滿足「同一個單元格內的字母不允許被重復使用」。
  • 當前的點,不是目標點,比如你想找 E,卻來到了 D。
class Solution {
    public boolean exist(char[][] board, String word) {
        if (board == null || board.length == 0) {
            return false;
        }
        boolean[][] visited = new boolean[board.length][board[0].length];
        char[] chars = word.toCharArray();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (existHelper(board, visited, chars, i, j, 0)) {
                    return true;
                }
            }
        }
        return false;
    }
    private boolean existHelper(char[][] board, boolean[][] visited, char[] chars, int row, int column, int index) {
        if (index == chars.length) {
            return true;
        }
        int[][] direction = new int[][]{
                {0, 1},
                {1, 0},
                {0, -1},
                {-1, 0}
        };
        if (row >= 0 && row < board.length &&
                column >= 0 && column < board[0].length &&
                board[row][column] == chars[index] &&
                !visited[row][column]) {
            visited[row][column] = true;
            for (int[] dir : direction) {
                int newX = row + dir[0];
                int newY = column + dir[1];
                if (existHelper(board, visited, chars, newX, newY, index + 1)) {
                    return true;
                }
            }
            visited[row][column] = false;
        }
        return false;
    }
}

時間復雜度:O(M*N * 3^L)

空間復雜度:O(M*N)

算法:DFS回溯(Go)

思路同上

func exist(board [][]byte, word string) bool {
	m, n := len(board), len(board[0])
	used := make([][]bool, m)
	for i := 0; i < m; i++ {
		used[i] = make([]bool, n)
	}
	var canFind func(r, c, i int) bool
	canFind = func(r, c, i int) bool {
		if i == len(word) {
			return true
		}
		if r < 0 || r >= m || c < 0 || c >= n {
			return false
		}
		if used[r][c] || board[r][c] != word[i] {
			return false
		}
		used[r][c] = true
		canFindRest := canFind(r+1, c, i+1) || canFind(r-1, c, i+1) ||
			canFind(r, c+1, i+1) || canFind(r, c-1, i+1)
		if canFindRest {
			return true
		} else {
			used[r][c] = false
			return false
		}
	}
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if board[i][j] == word[0] && canFind(i, j, 0) {
				return true
			}
		}
	}
	return false
}

時間復雜度:O(M*N * 3^L)

空間復雜度:O(M*N)

以上就是Go Java算法之單詞搜索示例詳解的詳細內容,更多關于Go Java算法單詞搜索的資料請關注腳本之家其它相關文章!

相關文章

  • Golang實現(xiàn)深拷貝reflect原理示例探究

    Golang實現(xiàn)深拷貝reflect原理示例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)reflect深拷貝原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go實現(xiàn)文件上傳和下載

    Go實現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細介紹了Go實現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Go?gRPC服務雙向流式RPC教程

    Go?gRPC服務雙向流式RPC教程

    這篇文章主要為大家介紹了Go?gRPC服務雙向流式RPC教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang之數(shù)組切片的具體用法

    golang之數(shù)組切片的具體用法

    本文主要介紹了golang之數(shù)組切片的具體用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • golang語言map全方位介紹

    golang語言map全方位介紹

    本文主要介紹了golang語言map全方位介紹,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解Go語言中調度器的原理與使用

    詳解Go語言中調度器的原理與使用

    這篇文章主要介紹了Go語言運行時調度器的實現(xiàn)原理,其中包含調度器的設計與實現(xiàn)原理、演變過程以及與運行時調度相關的數(shù)據(jù)結構,希望對大家有所幫助
    2023-07-07
  • Golang控制協(xié)程執(zhí)行順序方法詳解

    Golang控制協(xié)程執(zhí)行順序方法詳解

    這篇文章主要介紹了Golang控制協(xié)程執(zhí)行順序的方法,Golang的語法和運行時直接內置了對并發(fā)的支持。Golang里的并發(fā)指的是能讓某個函數(shù)獨立于其他函數(shù)運行的能力
    2022-11-11
  • 詳解golang中的method

    詳解golang中的method

    這篇文章主要介紹了golang中的method的相關資料,幫助大家更好的理解和使用golang,感興趣的朋友可以了解下
    2021-01-01
  • go數(shù)據(jù)結構和算法BitMap原理及實現(xiàn)示例

    go數(shù)據(jù)結構和算法BitMap原理及實現(xiàn)示例

    這篇文章主要為大家介紹了go數(shù)據(jù)結構和算法BitMap原理及實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • go交叉編譯sqlite報錯問題解決分析

    go交叉編譯sqlite報錯問題解決分析

    這篇文章主要為大家介紹了go交叉編譯sqlite報錯問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論