[Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]
生活随笔
收集整理的這篇文章主要介紹了
[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)
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)
【總結(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #41
- 下一篇: PDF转WORD工具破解版