日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【問題描述】[困難]

【解答思路】

1. 動(dòng)態(tài)規(guī)劃

第 1 步:設(shè)計(jì)狀態(tài)
dp[i][j]dp[i][j] 表示字符串 ss 的前 ii 個(gè)字符和模式 pp 的前 jj 個(gè)字符是否能匹配
第 2 步:狀態(tài)轉(zhuǎn)移方程

第 3 步:考慮初始化
boolean[][] dp = new boolean[m + 1][n + 1];

第 4 步:考慮輸出
dp[m][n];

時(shí)間復(fù)雜度:O(MN) 空間復(fù)雜度:O(MN)

public boolean isMatch(String s, String p) {int m = s.length();int n = p.length();boolean[][] dp = new boolean[m + 1][n + 1];dp[0][0] = true;for(int i=1 ;i<=n;i++){if(p.charAt(i-1)== '*'){dp[0][i]=true;}else{break;}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(p.charAt(j-1)=='*'){dp[i][j]= dp[i-1][j]|dp[i][j-1]; }else if((p.charAt(j-1) == s.charAt(i-1))||(p.charAt(j-1)=='?')){dp[i][j]= dp[i-1][j-1]; }}}return dp[m][n];}
2. 貪心

// 我們用 sIndex 和 pIndex 表示當(dāng)前遍歷到 s 和 p 的位置 // 此時(shí)我們正在 s 中尋找某個(gè) u_i // 其在 s 和 p 中的起始位置為 sRecord 和 pRecord// sIndex 和 sRecord 的初始值為 0 // 即我們從字符串 s 的首位開始匹配 sIndex = sRecord = 0// pIndex 和 pRecord 的初始值為 1 // 這是因?yàn)槟J?p 的首位是星號(hào),那么 u_1 的起始位置為 1 pIndex = pRecord = 1while sIndex < s.length and pIndex < p.length doif p[pIndex] == '*' then// 如果遇到星號(hào),說明找到了 u_i,開始尋找 u_i+1pIndex += 1// 記錄下起始位置sRecord = sIndexpRecord = pIndexelse if match(s[sIndex], p[pIndex]) then// 如果兩個(gè)字符可以匹配,就繼續(xù)尋找 u_i 的下一個(gè)字符sIndex += 1pIndex += 1else if sRecord + 1 < s.length then// 如果兩個(gè)字符不匹配,那么需要重新尋找 u_i// 枚舉下一個(gè) s 中的起始位置sRecord += 1sIndex = sRecordpIndex = pRecordelse// 如果不匹配并且下一個(gè)起始位置不存在,那么匹配失敗return Falseend if end while// 由于 p 的最后一個(gè)字符是星號(hào),那么 s 未匹配完,那么沒有關(guān)系 // 但如果 p 沒有匹配完,那么 p 剩余的字符必須都是星號(hào) return all(p[pIndex] ~ p[p.length - 1] == '*')


時(shí)間復(fù)雜度:O(MN) 空間復(fù)雜度:O(MlogN)

class Solution {public boolean isMatch(String s, String p) {int sRight = s.length(), pRight = p.length();while (sRight > 0 && pRight > 0 && p.charAt(pRight - 1) != '*') {if (charMatch(s.charAt(sRight - 1), p.charAt(pRight - 1))) {--sRight;--pRight;} else {return false;}}if (pRight == 0) {return sRight == 0;}int sIndex = 0, pIndex = 0;int sRecord = -1, pRecord = -1;while (sIndex < sRight && pIndex < pRight) {if (p.charAt(pIndex) == '*') {++pIndex;sRecord = sIndex;pRecord = pIndex;} else if (charMatch(s.charAt(sIndex), p.charAt(pIndex))) {++sIndex;++pIndex;} else if (sRecord != -1 && sRecord + 1 < sRight) {++sRecord;sIndex = sRecord;pIndex = pRecord;} else {return false;}}return allStars(p, pIndex, pRight);}public boolean allStars(String str, int left, int right) {for (int i = left; i < right; ++i) {if (str.charAt(i) != '*') {return false;}}return true;}public boolean charMatch(char u, char v) {return u == v || v == '?';} }

【總結(jié)】

1.動(dòng)態(tài)規(guī)劃流程

第 1 步:設(shè)計(jì)狀態(tài)
第 2 步:狀態(tài)轉(zhuǎn)移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態(tài)壓縮

2.貪心 字符串匹配 細(xì)心分情況

轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/wildcard-matching/solution/tong-pei-fu-pi-pei-by-leetcode-solution/

總結(jié)

以上是生活随笔為你收集整理的[Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。