Python算法題集_單詞搜索

Python算法題集_單詞搜索

  • 題22:單詞搜索
  • 1. 示例說明
  • 2. 題目解析
    • - 題意分解
    • - 優化思路
    • - 測量工具
  • 3. 代碼展開
    • 1) 標準求解【原始矩陣狀態+回溯】
    • 2) 改進版一【字典檢測+原始矩陣狀態+回溯】
    • 3) 改進版二【矩陣狀態+回溯】
  • 4. 最優算法
  • 5. 相關資源

本文為Python算法題集之一的代碼示例

題22:單詞搜索

1. 示例說明

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

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

    示例 1:

    img

    輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
    輸出:true
    

    示例 2:

    img

    輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
    輸出:true
    

    示例 3:

    img

    輸入: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
    • boardword 僅由大小寫英文字母組成

    **進階:**你可以使用搜索剪枝的技術來優化解決方案,使其在 board 更大的情況下可以更快解決問題?


2. 題目解析

- 題意分解

  1. 本題是在矩陣內檢查是否有相鄰元素組成對應單詞
  2. 矩陣內每一個元素最多有4個方向,考慮到搜索進入方向,從第二個字母開始,最多有3個方向,可以用回溯法解題
  3. 回溯法(探索與回溯法)是一種選優搜索法,又稱為試探法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇并不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法。

- 優化思路

  1. 通常優化:減少循環層次

  2. 通常優化:增加分支,減少計算集

  3. 通常優化:采用內置算法來提升計算速度

  4. 分析題目特點,分析最優解

    1. 可以使用字典進行字符檢測,只有存在檢測單詞所有字符的矩陣才展開搜索

    2. 可以使用原始矩陣保存檢測狀態,也可以另外使用矩陣保存檢測狀態


- 測量工具

  • 本地化測試說明:LeetCode網站測試運行時數據波動很大【可把頁面視為功能測試】,因此需要本地化測試解決數據波動問題
  • CheckFuncPerf(本地化函數用時和內存占用測試模塊)已上傳到CSDN,地址:Python算法題集_檢測函數用時和內存占用的模塊
  • 本題本地化超時測試用例自己生成,詳見章節【最優算法】,代碼文件包含在【相關資源】中

3. 代碼展開

1) 標準求解【原始矩陣狀態+回溯】

使用原始矩陣保存檢測狀態【當前已檢測路徑值設置為’'】,實現回溯

頁面功能測試,馬馬虎虎,超過76%在這里插入圖片描述

import CheckFuncPerf as cfpclass Solution:def exist_base(self, board, word):def dfs_backtrack(irow, icol, icheckpos):if not 0 <= irow < len(board) or not 0 <= icol < len(board[0]) or \board[irow][icol] != word[icheckpos]:return Falseif icheckpos == len(word) - 1:return Trueboard[irow][icol] = ''result = dfs_backtrack(irow + 1, icol, icheckpos + 1) or \dfs_backtrack(irow - 1, icol, icheckpos + 1) or \dfs_backtrack(irow, icol + 1, icheckpos + 1) or \dfs_backtrack(irow, icol - 1, icheckpos + 1)board[irow][icol] = word[icheckpos]return resultfor irow in range(len(board)):for icol in range(len(board[0])):if board[irow][icol] == word[0] and dfs_backtrack(irow, icol, 0):return Truereturn FalseaSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_base, checkmapmatrix, checkword)
print(result['msg'], '執行結果 = {}'.format(result['result']))# 運行結果
函數 exist_base 的運行時間為 24.00 ms;內存使用量為 684.00 KB 執行結果 = True

2) 改進版一【字典檢測+原始矩陣狀態+回溯】

使用字典進行字符集檢測,符合要求的才開始回溯;回溯中使用原始矩陣保存檢測狀態

頁面功能測試,性能卓越,超越95%在這里插入圖片描述

import CheckFuncPerf as cfpclass Solution:def exist_ext1(self, board, word):def preCheck():preDict = {}for chr in word:if chr in preDict:preDict[chr] += 1else:preDict[chr] = 1for arow in board:for achr in arow:if achr in preDict and preDict[achr] > 0:preDict[achr] -= 1for aval in preDict.values():if aval > 0:return Falsereturn Truedef dfs_backtrack(irow, icol, icheckpos):if icheckpos == imaxlen:return Trueif 0 <= irow < imaxrow and 0 <= icol < imaxcol and board[irow][icol] == word[icheckpos]:board[irow][icol] = ''for inextrow, inextcol in (irow, icol + 1), (irow, icol - 1), \(irow + 1, icol), (irow - 1, icol):if dfs_backtrack(inextrow, inextcol, icheckpos + 1):return Trueboard[irow][icol] = word[icheckpos]return Falseif preCheck() == False:return Falseimaxrow, imaxcol, imaxlen = len(board), len(board[0]), len(word)for irow in range(imaxrow):for icol in range(imaxcol):if board[irow][icol] == word[0] and dfs_backtrack(irow, icol, 0):return Truereturn FalseaSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext1, checkmapmatrix, checkword)
print(result['msg'], '執行結果 = {}'.format(result['result']))# 運行結果
函數 exist_ext1 的運行時間為 25.01 ms;內存使用量為 644.00 KB 執行結果 = True

3) 改進版二【矩陣狀態+回溯】

使用多維列表結構保存檢測路徑狀態,實現回溯

頁面功能測試,性能良好,超過88%在這里插入圖片描述

import CheckFuncPerf as cfpclass Solution:def exist_ext2(self, board, word):imaxrow, imaxcol, imaxlen = len(board), len(board[0]), len(word)path = [''] * imaxlenmap_check = [[False] * imaxcol for x in range(imaxrow)]def dfs_backtrack(icheckpos, irow, icol, imaxrow, imaxcol, board, word, checkmatrix):if irow < 0 or irow >= imaxrow or icol < 0 or icol >= imaxcol:return Falseif checkmatrix[irow][icol]:return Falseif board[irow][icol] != word[icheckpos]:return Falseif icheckpos == imaxlen - 1:return Truepath[icheckpos] = word[icheckpos]checkmatrix[irow][icol] = Trueif dfs_backtrack(icheckpos + 1, irow - 1, icol, imaxrow, imaxcol, board, word, checkmatrix) or \dfs_backtrack(icheckpos + 1, irow + 1, icol, imaxrow, imaxcol, board, word, checkmatrix) or \dfs_backtrack(icheckpos + 1, irow, icol - 1, imaxrow, imaxcol, board, word, checkmatrix) or \dfs_backtrack(icheckpos + 1, irow, icol + 1, imaxrow, imaxcol, board, word, checkmatrix):return Truecheckmatrix[irow][icol] = Falsepath[icheckpos] = ''return Falsefor irow in range(imaxrow):for icol in range(imaxcol):if dfs_backtrack(0, irow, icol, imaxrow, imaxcol, board, word, map_check):return Truereturn FalseaSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext2, checkmapmatrix, checkword)
print(result['msg'], '執行結果 = {}'.format(result['result']))# 運行結果
函數 exist_ext2 的運行時間為 43.01 ms;內存使用量為 384.00 KB 執行結果 = True

4. 最優算法

根據本地日志分析,最優算法為第1種方式【原始矩陣狀態+回溯】exist_base

本題測試數據,似乎能推出以下結論:

  1. 字典過濾檢測性能消耗極小
  2. 額外的數據存儲,帶來額外的性能消耗
  3. 在檢測集合和字符串多樣化的情況下,第二種算法其實是會表現更好
import random, copy
imaxrow, imaxcol, checkword = 500, 300, ''
mapmatrix=[['' for x in range(imaxcol)] for y in range(imaxrow)]
words = list('abcdefghijklmnopqrstuvwxyz')
for irow in range(imaxrow):for icol in range(imaxcol):mapmatrix[irow][icol] = random.choice(words)
for iIdx in range(1, min(imaxrow, imaxcol)):checkword += mapmatrix[imaxrow-iIdx][imaxcol-iIdx] + mapmatrix[imaxrow-iIdx][imaxcol-iIdx-1]
aSolution = Solution()
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_base, checkmapmatrix, checkword)
print(result['msg'], '執行結果 = {}'.format(result['result']))
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext1, checkmapmatrix, checkword)
print(result['msg'], '執行結果 = {}'.format(result['result']))
checkmapmatrix = copy.deepcopy(mapmatrix)
result = cfp.getTimeMemoryStr(aSolution.exist_ext2, checkmapmatrix, checkword)
print(result['msg'], '執行結果 = {}'.format(result['result']))# 算法本地速度實測比較
函數 exist_base 的運行時間為 24.00 ms;內存使用量為 684.00 KB 執行結果 = True
函數 exist_ext1 的運行時間為 25.01 ms;內存使用量為 644.00 KB 執行結果 = True
函數 exist_ext2 的運行時間為 43.01 ms;內存使用量為 384.00 KB 執行結果 = True

5. 相關資源

本文代碼已上傳到CSDN,地址:Python算法題源代碼_LeetCode(力扣)_單詞搜索

一日練,一日功,一日不練十日空

may the odds be ever in your favor ~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716703.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DM數據庫學習之路(十九)DM8數據庫sysbench部署及壓力測試

sysbench部署 安裝依賴 yum -y install make automake libtool pkgconfig libaio-devel vim-common 上傳sysbench源代碼 sysbench_tool.tar 測試是否安裝成功 $ /opt/sysbench/sysbench-master-dpi/src/lua $ ./sysbench --version sysbench 1.1.0 sysbench測試DM 測試…

jupyter調用envs環境——jupyter內核配置虛擬環境

1.jupyter無法使用envs環境 pycharm的終端打開jupyter notebook&#xff1a; 在kernel下找不到上面的Pytorch_GPU環境&#xff1a; 2.解決方法 在對應的envs環境中安裝ipykernel&#xff1a; 將該環境寫入jupyter&#xff1a; python -m ipykernel install --user --name Py…

基于分位數回歸的長短期記憶神經網絡(QRLSTM)的MATLAB實現(源代碼)

分位數回歸的長短期神經記憶網絡介紹&#xff1a; QRLSTM&#xff08;Quantile Regression Long Short-Term Memory&#xff09;分位數回歸神經網絡是一種結合了長短期記憶&#xff08;LSTM&#xff09;神經網絡和分位數回歸的模型。這種神經網絡結構旨在對數據的不同分位數進行…

Java的四大引用詳解-沖擊金三銀四

強引用 像“Object obj new Object()”這類的引用均為強引用&#xff0c;當一個對象被強引用變量引用時&#xff0c;它處于可達狀態&#xff0c;是不可能被垃圾回收器回收的&#xff0c;即使該對象永遠不會被用到也不會被回收。 當JVM出現內存不足時&#xff0c;JVM進行垃圾回…

繼承-重寫

Phone基類&#xff1a; package ven;public class Phone {public Phone(){}public void call(String name){System.out.println("給"name"打電話");} } AIPhone子類&#xff1a; package ven;public class AIPhone extends Phone{Override //重載注解&am…

mTLS: openssl創建CA證書

證書可以通過openssl或者keytool創建&#xff0c;在本篇文章中&#xff0c;只介紹openssl。 openssl 生成證書 申請操作流程 生成ca證書私鑰, 文件名&#xff1a;ca.key生成ca證書&#xff0c;文件名&#xff1a;ca.crt生成Server/Client 證書私鑰&#xff0c;文件名&#x…

設計模式(十三)抽象工廠模式

請直接看原文:設計模式&#xff08;十三&#xff09;抽象工廠模式_抽象工廠模式告訴我們,要針對接口而不是實現進行設計。( )-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- …

系統架構設計文檔模版

XX 系統架構設計方案 修訂記錄 日期 版本號 修訂說明 修訂人 審核人 1、概述... 5 1.1&#xff0e;業務背景... 5 1.2&#xff0e;系統總體描述... 5 1.3&#xff0e;系統邊界圖... 5 1.4&#xff0e;名詞和縮略語... 5 1.…

live555源碼學習(1)

1 基礎組件 live項目主要包含了四個基礎庫、程序入口類&#xff08;mediaServer&#xff09;和測試程序&#xff08;testProgs&#xff09;。四個基礎庫是UsageEnvironment、BasicUsageEnvironment、groupsock和liveMedia UsageEnvironment 抽象了兩個類UsageEnvironment和T…

力扣hot5---雙指針

題目&#xff1a; 解決方案&#xff1a;雙指針 指針 i 指向最左側&#xff0c;指針 j 指向最右側。此時在寬度上達到了最大值&#xff0c;那么哪個柱子更矮&#xff0c;哪個柱子向內部移動&#xff0c;知道 i 與 j 相遇。為什么呢&#xff1f; 如果哪個哪個柱子更矮&#xff0c…

代碼隨想錄算法訓練營第四十一天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III

系列文章目錄 代碼隨想錄算法訓練營第一天|數組理論基礎&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代碼隨想錄算法訓練營第二天|977.有序數組的平方 &#xff0c;209.長度最小的子數組 &#xff0c;59.螺旋矩陣II 代碼隨想錄算法訓練營第三天|鏈表理論基礎&#xff…

Node.js基礎---模塊化

基本概念 模塊化 模塊化是指解決一個復雜問題時&#xff0c;自上向下逐層把系統劃分成若干模塊的過程&#xff0c;對于整個系統來說&#xff0c;模塊是可組合&#xff0c;分解和更換的單元 遵守固定規則&#xff0c;把大文件拆分成獨立并互相依賴的多個小模塊 好處&#xff1a…

【計算機畢業設計】208基于SSM的在線教育網站

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

OLLAMA:如何像專業人士一樣運行本地語言模型

原文 https://cheatsheet.md/llm-leaderboard/ollama.en簡介&#xff1a;揭示 OLLAMA 對本地語言模型的強大功能 您是否曾經發現自己陷入了基于云的語言模型網絡中&#xff0c;渴望獲得更本地化、更具成本效益的解決方案&#xff1f;好吧&#xff0c;您的搜索到此結束。歡迎來…

逆向案例四、進階,爬取精靈數據咨詢前五十頁數據

python代碼示例: import csv import execjs import requests f open(精靈數據.csv,w,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[標題,發布時間,新聞來源,詳情頁鏈接,轉自,點擊量,新聞作者,發布時間小時,]) csv_writer.writeheader() data [] for pa…

【Ansys Fluent Web 】全新用戶界面支持訪問大規模多GPU CFD仿真

基于Web的技術將釋放云計算的強大功能&#xff0c;加速CFD仿真&#xff0c;從而減少對硬件資源的依賴。 主要亮點 ? 使用Ansys Fluent Web用戶界面?&#xff08;UI&#xff09;&#xff0c;用戶可通過任何設備與云端運行的仿真進行遠程交互 ? 該界面通過利用多GPU和云計算功…

理解python3中的回調函數

百度百科說&#xff1a;回調函數就是一個通過函數指針調用的函數。如果你把函數的指針&#xff08;地址&#xff09;作為參數傳遞給另一個函數&#xff0c;當這個指針被用來調用其所指向的函數時&#xff0c;我們就說這是回調函數。回調函數不是由該函數的實現方直接調用&#…

Sqli-labs靶場第13關詳解[Sqli-labs-less-13]

Sqli-labs-Less-13 #手工注入 post傳參了 根據題目看&#xff0c;像一個登錄頁面&#xff0c;嘗試使用布爾型盲注測試能否登錄網站 1. Username輸入a 測試是否會有報錯&#xff0c;burp抓包 報錯&#xff1a;syntax to use near a) and password() LIMIT 0,1 at line 1 分…

[python] `json.dumps()` TypeError: Object of type set is not JSON serializable

在Python中&#xff0c;當你嘗試將一個集合&#xff08;set&#xff09;類型的對象轉換為JSON格式時&#xff0c;可能會遇到“TypeError: Object of type set is not JSON serializable”的錯誤。這是因為標準的JSON格式不支持Python中的集合類型&#xff0c;JSON格式支持的數據…

【04】C語言括號匹配問題

歡迎來到土土的博客~&#x1f973;&#x1f973;&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;個人主頁&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所屬專欄&#xff1a;C語言系列函數實現 題目描述&#xff1a; 給定一個只包括 ‘(’&#xff0c;‘)’&#xf…