最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

單詞搜索

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

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

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

遞歸的關(guān)鍵點(diǎn)

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

那么,哪些情況說明這是一個(gè)錯(cuò)的點(diǎn):

  • 當(dāng)前的點(diǎn),越出矩陣邊界。
  • 當(dāng)前的點(diǎn),之前訪問過,不滿足「同一個(gè)單元格內(nèi)的字母不允許被重復(fù)使用」。
  • 當(dāng)前的點(diǎn),不是目標(biāo)點(diǎn),比如你想找 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;
    }
}

時(shí)間復(fù)雜度:O(M*N * 3^L)

空間復(fù)雜度: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
}

時(shí)間復(fù)雜度:O(M*N * 3^L)

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

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

相關(guān)文章

  • Go語言使用defer+recover解決panic導(dǎo)致程序崩潰的問題

    Go語言使用defer+recover解決panic導(dǎo)致程序崩潰的問題

    如果協(xié)程出現(xiàn)了panic,就會造成程序的崩潰,這時(shí)可以在goroutine中使用recover來捕獲panic,進(jìn)行處理,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-09-09
  • golang?MySQL實(shí)現(xiàn)對數(shù)據(jù)庫表存儲獲取操作示例

    golang?MySQL實(shí)現(xiàn)對數(shù)據(jù)庫表存儲獲取操作示例

    這篇文章主要為大家介紹了golang?MySQL實(shí)現(xiàn)對數(shù)據(jù)庫表存儲獲取操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • golang 獲取明天零點(diǎn)的時(shí)間戳示例

    golang 獲取明天零點(diǎn)的時(shí)間戳示例

    今天小編就為大家分享一篇golang 獲取明天零點(diǎn)的時(shí)間戳示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • go語言 swagger 查詢 json 字段注釋的示例代碼

    go語言 swagger 查詢 json 字段注釋的示例代碼

    在Go語言中,使用Swagger通過swag工具和gin-gonic框架生成API文檔,涉及引入依賴、定義模型、添加注釋等步驟,示例中展示了如何為接受查詢參數(shù)的API端點(diǎn)添加注釋,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • go語言中的return語句

    go語言中的return語句

    這篇文章主要介紹了go語言中的return語句,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-05-05
  • 詳解Golang中channel的實(shí)現(xiàn)

    詳解Golang中channel的實(shí)現(xiàn)

    channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個(gè)先進(jìn)先出的隊(duì)列,使用goroutine+channel進(jìn)行數(shù)據(jù)通訊簡單高效,同時(shí)也線程安全,本文就給大家講講Golang中channel的實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn)

    Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn)

    本文主要介紹了Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go日志框架zap增強(qiáng)及源碼解讀

    Go日志框架zap增強(qiáng)及源碼解讀

    這篇文章主要為大家介紹了Go日志框架zap增強(qiáng)及源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Go語言微服務(wù)開發(fā)框架之Go chassis

    詳解Go語言微服務(wù)開發(fā)框架之Go chassis

    分布式系統(tǒng)中每個(gè)進(jìn)程的動態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問題。go chassis汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來自己的創(chuàng)新特性。
    2021-05-05
  • golang簡易令牌桶算法實(shí)現(xiàn)代碼

    golang簡易令牌桶算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang簡易令牌桶算法實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

信阳市| 周口市| 盱眙县| 瓦房店市| 新密市| 贵州省| 芮城县| 西藏| 新营市| 呼伦贝尔市| 佛冈县| 新龙县| 合江县| 望奎县| 六安市| 扎囊县| 乐昌市| 讷河市| 阳东县| 遵义市| 东丽区| 旺苍县| 西城区| 怀远县| 五家渠市| 长葛市| 余庆县| 花莲市| 邳州市| 留坝县| 罗城| 郸城县| 剑阁县| 罗平县| 称多县| 栾城县| 巴彦淖尔市| 青田县| 桂林市| 昌宁县| 云南省|