LeetCode--44.通配符匹配

前言:不知不覺又斷更一天了,其實昨天就把這道題寫得差不多了,只是剛好在力扣里面看見了一種新的解法,本來想寫出來的,但是我把它推到今天了,因為太晚了,但是今天又睡懶覺了,所以我直接寫出思路,就不寫代碼了,今天在寫了這道題的題解之后,我覺得我之前寫的力扣第十題的題解相比于這道題還是太過于稚嫩了,沒有抓到主體上面,不夠通俗易懂,都是它的缺點

解題思路:

? ? ? ? 1.獲取信息:

? ? ? ? ? ? ? ? 給定一個字符串和一個字符模式

? ? ? ? ? ? ? ? 字符模式中包含小寫字母,?以及 *?

? ? ? ? ? ? ? ? ?:可以匹配任何單個字符

? ? ? ? ? ? ? ? *? :可以匹配任意字符序列(包括空字符序列)

? ? ? ? ? ? ? ? 要求判斷字符模式是否能完全匹配字符串

? ? ? ? 2.分析題目:

? ? ? ? ? ? ? ? 在看到這道題的時候,我想到了之前寫過的,力扣第十題,正則表達式

? ? ? ? ? ? ? ? 它也是給定一個字符串和字符模式,只不過字符模式中的特殊符號的功能比這道題中的要復雜一些,所以這道題可以說是一道簡化后的第十題

? ? ? ? ? ? ? ? 那么,它的方法就不言而喻了,與第十題一樣,是動態規劃法,但我轉念一想,要是方法都不怎么改變,沒有多少新意,那怎么能考驗自己呢?

? ? ? ? ? ? ? ? 所以我又嘗試用它的核心思想寫了一下遞歸法,但是很遺憾,在1638個示例的時候,超時了,不過我還是會講解一下,也許可以幫助你理解

? ? ? ? ? ? ? ? 最后,我會講解一下力扣看到的那個新方法,也很不錯的

? ? ? ? 3.示例查驗:

? ? ? ? ? ? ? ? 略

? ? ? ? 4.嘗試編寫代碼:

? ? ? ? ? ? ? ? (1)動態規劃法:

? ? ? ? ? ? ? ? ? ? ? ? 思路:動態規劃:用小問題來逐步推導出大問題

? ? ? ? ? ? ? ? ? ? ? ? 我們知道在面對通配符,肯定是需要考慮多種情況的,就以遇到 * 為例

? ? ? ? ? ? ? ? ? ? ? ? 遇到 * ,它就會存在兩種情況,它表示空字符或者表示非空字符

? ? ? ? ? ? ? ? ? ? ? ? 表示空字符,那就無事發生

? ? ? ? ? ? ? ? ? ? ? ? 表示非空字符,那它可能表示一個字符,兩個字符或者更多的字符

? ? ? ? ? ? ? ? ? ? ? ? 這些都是需要考慮的情況

? ? ? ? ? ? ? ? ? ? ? ? 實際上,動態規劃并不能解決我上面說的需要考慮多種情況的難題

? ? ? ? ? ? ? ? ? ? ? ? 動態規劃解決的只是,一個既定事實的未來發展而已,就比如說,它的下一步的發展是取決于上一步的確定,所以我們動態規劃實行的方式如下

? ? ? ? ? ? ? ? ? ? ? ? 先說一下前提,我們肯定是要掃描字符來進行匹配的,那么以誰為主體開始掃描呢?

? ? ? ? ? ? ? ? ? ? ? ? 那肯定是字符模式了,因為字符模式中不止存在小寫字母

? ? ? ? ? ? ? ? ? ? ? ? 好了,說回動態規劃

? ? ? ? ? ? ? ? ? ? ? ? 以掃描字符模式為主體,會遇到三種情況

? ? ? ? ? ? ? ? ? ? ? ? 1.小寫字母,比較字符串中對應位置,相同,則繼續,不同,直接結束

? ? ? ? ? ? ? ? ? ? ? ? 2.?,可以匹配任意字符,直接繼續

? ? ? ? ? ? ? ? ? ? ? ? 3. * ,需要考慮表示空字符和非空字符的情況

? ? ? ? ? ? ? ? ? ? ? ? 如你所見,這些判斷都是默認前面的字符完全相匹配的情況下,才可以這么判斷

? ? ? ? ? ? ? ? ? ? ? ? 并且,在遇到 * ,動態規劃就顯得有些手足無措了,所以單純的動態規劃不能解決遇到 * 的情況

? ? ? ? ? ? ? ? ? ? ? ? 所以,我們如果是個機器,要處理這樣的問題,我們只會遍歷完所有的情況,讓所有的情況都用動態規劃走一遍,那么只要有一條走得通,那么就說明可以匹配

? ? ? ? ? ? ? ? ? ? ? ? 其實核心不怎么在動態規劃,而是這個遍歷完所有的情況的步驟

? ? ? ? ? ? ? ? ? ? ? ? 我們在遇到 * 時,就依次遍歷,* 表示零個字符,一個字符,兩個字符等多個字符的情況,只要有一條走得通,那么就表示匹配成功

? ? ? ? ? ? ? ? ? ? ? ? 以下是完整代碼

class Solution {
public:bool isMatch(string s, string p) {//代碼跟力扣第十題大致沒有多少區別,就不進行注釋了int m=s.size();int n=p.size();vector<vector<bool>>dp(m+1,vector<bool>(n+1,false));dp[m][0]=false;dp[0][0]=true;for(int j=1;j<=n;j++){if(p[j-1]=='*')dp[0][j]=true;else break;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(p[j-1]=='*'){dp[i][j]=dp[i][j-1]||dp[i-1][j];}else if(p[j-1]=='?'){dp[i][j]=dp[i-1][j-1];}else{dp[i][j]=(s[i-1]==p[j-1])&&dp[i-1][j-1];}}}return dp[m][n];}
};

? ? ? ? ? ? ? ? (2)遞歸法:

? ? ? ? ? ? ? ? ? ? ? ? 思路:上面我們說了遇到星號,要依次遍歷每種情況,我就想到用遞歸這種方便推行多種情況的方法,來對每種情況進行遍歷

? ? ? ? ? ? ? ? ? ? ? ? 但是很遺憾,如我上面所說,在第1638個示例的時候,超時了

? ? ? ? ? ? ? ? ? ? ? ? 以下是完整代碼

class Solution {
public:bool isMatch(string s, string p) {return GetRes(s,p,0,0,s.size(),p.size());}
private:bool GetRes(string&s,string&p,int i,int j,int m,int n){if(j==n)return i==m;if(i==m){while(j<n&&p[j]=='*')j++;return j==n;}if(p[j]=='*'){return GetRes(s,p,i,j+1,m,n)||GetRes(s,p,i+1,j,m,n);}else if(p[j]=='?'){return GetRes(s,p,i+1,j+1,m,n);}else{if(s[i]==p[j]){return GetRes(s,p,i+1,j+1,m,n);}else return false;}}
};

? ? ? ? ? ? ? ? (3)貪心算法:

? ? ? ? ? ? ? ? ? ? ? ? 這是我在力扣上面看到的題解,比較驚奇,我一開始沒有想出來,故而記錄下來

? ? ? ? ? ? ? ? ? ? ? ? 思路:在字符模式中,比較麻煩的就是碰到星號,其他的符號不值一提

? ? ? ? ? ? ? ? ? ? ? ? 如果沒有星號,這道題會變得特別簡單,所以,有沒有辦法去無視星號呢?

? ? ? ? ? ? ? ? ? ? ? ? 當然有,星號出現零次的情況不用考慮,特別簡單,就直接說星號出現非零次的情況

? ? ? ? ? ? ? ? ? ? ? ? 那么字符模式的樣式,差不多就是 " xxx * xxx * xxx * xxx "等樣式

? ? ? ? ? ? ? ? ? ? ? ? 因為星號可以表示任意字符序列,所以,我們只用判斷那些 xxx 的是否存在字符串之中,并且它們的相對位置是否一致,就可以表明是相匹配的

以上就是本次題解了,我這個暑假要去學車,科目一的題目還沒有開始練,不知道自己暑假為什么會這么懶惰,天天不是玩云頂之弈去找虐,就是打排位去找氣受,不知道我的腦袋里面在想啥

唉,算了,算了,我已經把游戲給刪掉了,頂多每天上線打一下日活,不能再墮落下去了

提醒:紙上得來終覺淺,絕知此事要躬行

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

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

相關文章

WHAT - 依賴管理工具 CocoaPods

文章目錄1. 什么是 CocoaPods&#xff1f;2. 如何安裝 CocoaPods&#xff1f;(1) 確保已安裝 Ruby&#xff08;macOS 默認自帶&#xff09;(2) 安裝 CocoaPods(3) 驗證安裝3. 在 React Native 項目中使用 CocoaPods(1) 進入 iOS 目錄(2) 初始化 Podfile&#xff08;如果不存在&…

C++ Boost Aiso TCP 網絡聊天(服務端客戶端一體化)

代碼功能說明: 程序模式: 主動連接模式:當用戶指定對端 IP 和端口時,嘗試連接到對端被動監聽模式:當用戶未指定對端 IP 時,等待其他節點連接線程模型: 主線程:處理用戶輸入和消息發送接收線程:后臺接收并顯示對端消息關鍵組件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45獵人寶寶狼 技能恢復宏已知3.45BUG RL技能位會清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修復以前可用宏一鍵恢復狀態-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

對于編寫PID過程中的問題

當stm32RCT6使用位置環pid控制麥輪轉動一定路程時&#xff0c;在這個時間段內想讓一邊輪胎速度加大應該怎么做&#xff1f;比如我pid的目標脈沖值為9000&#xff0c;在運行到3000的時候車偏左了&#xff0c;那我應該怎樣讓他回正&#xff0c;我想到的辦法是增加其最大的脈沖值&…

LeetCode|Day13|88. 合并兩個有序數組|Python刷題筆記

LeetCode&#xff5c;Day13&#xff5c;88. 合并兩個有序數組&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;88. 合并兩個有序數組 難度&#xf…

【C++】初識C++(1)

個人主頁&#xff1a;我要成為c嘎嘎大王 希望這篇小小文章可以讓你有所收獲&#xff01; 目錄 前言 一、C的第一個程序 二、命名空間 2.1 namespace 的價值 2.2 namespace 的定義 2.2.1 正常的命名空間定義 2.2.2 命名空間可以嵌套 2.2.3 匿名命名空間 2.2.4 同名的name…

在新聞資訊 APP 中添加不同新聞分類頁面,通過 ViewPager2 實現滑動切換

在新聞資訊 APP 中添加不同新聞分類頁面&#xff0c;通過 ViewPager2 實現滑動切換 核心組件的作用 ViewPager2&#xff1a;是 ViewPager 的升級版&#xff0c;基于RecyclerView實現&#xff0c;支持水平 / 垂直滑動、RTL&#xff08;從右到左&#xff09;布局&#xff0c;且修…

vuex操作state為什么要使用mutations作為規范而不是直接修改state

1. 狀態變更的可追蹤性 (Trackable Changes)Devtools 集成&#xff1a;Vue Devtools 可以捕獲每次 mutation 的執行記錄&#xff0c;記錄變更前后的 state 快照、參數和調用棧。直接修改 state&#xff1a;Devtools 無法檢測到變更來源&#xff0c;導致調試困難&#xff08;如無…

Spring AI 系列之九 - RAG-入門

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

【數據結構】基于順序表的通訊錄實現

目錄 1 順序表的概念及結構 1.1 線性表 1.2 順序表分類 1.2.1 靜態順序表 1.2.2 動態順序表 2 順序表的實現 2.1 順序表的初始化 2.2 順序表中數據的增加和修改 2.2.1 順序表的頭插 2.2.2 順序表的尾插 2.2.3 順序表的頭刪 2.2.4 順序表的尾刪 2.2.5 順序表指定位置…

C語言與匯編混合編程

一、GCC 擴展語法與MSVC約束 &#xff08;一&#xff09;GCC&#xff08;GNU Compiler Collection&#xff09;內聯匯編語法 asm("匯編指令");#或者 __asm__("匯編指令");#使用更復雜的語法來指定輸入、輸出操作數和修改的寄存器&#xff1a; asm volatile…

WPF中的ListBox詳解

文章目錄簡介ListBoxItem選中項目動態列表簡介 【ListBox】是列表控件&#xff0c;其內部可包含多個【ListBoxItem】&#xff0c;用戶可以從列表中選擇一個或多個項&#xff0c;若Item個數超過指定高度&#xff0c;則右側會自動出現滾動條&#xff0c;非常便捷。盡管邏輯上來說…

【歷史人物】【李白】生平事跡

目錄 一、李白個人簡歷 二、個人主要經歷 三、個人成就及影響 1、詩 2、詞 3、書法 4、劍術 5、理想 四、歷史評價 五、趣事 1、李白擱筆 2、贈汪倫 一、李白個人簡歷 基本信息? 姓名&#xff1a;李白&#xff0c;字太白&#xff0c;號青蓮居士 性別&#xff1…

HALCON+PCL混合編程

HALCON與PCL的混合編程基礎 HALCON和PCL(Point Cloud Library)都是處理3D數據的強大工具&#xff0c;但它們有著不同的設計目標和數據結構。HALCON專注于機器視覺應用&#xff0c;提供了豐富的圖像處理和分析功能&#xff1b;而PCL則是專門為點云處理設計的開源庫。 要實現兩者…

JavaScript書寫基礎和基本數據類型

JavaScript書寫基礎和基本數據類型 jarringslee js書寫基礎和規范 js是一種在客戶端&#xff08;瀏覽器&#xff09;運行的編程語言&#xff0c;可實現人機交互的效果。js組成&#xff1a; js由兩部分組成&#xff1a; ECMAScript&#xff1a;js的語言基礎&#xff0c;js遵循其…

CSS個人筆記分享【僅供學習交流】

1、調整透明度 .text{ background-color: rgba(0, 0, 0, 0.08); }解釋&#xff1a;rgba&#xff08;rgb三元素&#xff0c;透明度取值從0~1&#xff09; 2、文字和圖片對齊方式 長用于頭像旁邊的昵稱居中顯示<img src"img/hua" alt"">華仔</img&g…

24.找到列表中最大或最小值的索引

找到列表中最大或最小值的索引 在 Python 中,如果你想找出某個列表中最小或最大值的位置(索引),你可以通過兩步快速實現: 使用 min() 或 max() 獲取目標值使用 .index() 獲取目標值在列表中的索引位置? 基礎實現 def min_element_index(arr):return arr.index(min(arr)

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘pandas’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘pandas’問題 摘要 在使用 PyCharm 的 Python 控制臺或終端執行 pip install pandas 后&#xff0c;仍然出現 ModuleNotFoundError: No module named ‘pandas…

【env環境】rtthread5.1.0使用fal組件

配置 board/Kconfigconfig BSP_USING_ON_CHIP_FLASHbool "Enable On Chip Flash"default ncp rt-thread/components/fal/samples/porting/fal_cfg.h board/fal_cfg.h /** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.…

C++20 協程參考手冊詳解 - 源自 cppreference.com

C20 協程參考手冊詳解 - 源自 cppreference.com 人話版 先說“人說”&#xff0c;簡化版本&#xff0c;更易理解。 宏觀概念&#xff1a;協程是一個可以暫定和恢復執行的函數。&#xff08;普通函數是線程相關的&#xff0c;函數的調用依賴于線程棧&#xff0c;而協程的運行…