題目描述:
給定乙個字串 (s
) 和乙個字元模式 (p
) ,實現乙個支援'?'
和'*'
的萬用字元匹配。
'?' 可以匹配任何單個字元。
'*' 可以匹配任意字串(包括空字串)。
兩個字串完全匹配才算匹配成功。
說明:
思路一:
字串p是模式字串,字串s是待匹配字串,使用p對s進行匹配。聯想到編輯距離那道題,使用兩個指標i和j,i指向字串s的第i個字元,j指向p的第j個字元,dp[i][j]=true表示字串s的前i個字元可以編輯成字串p的第j個字元,則存在三種情況,使dp[i][j]成立。
同理,萬用字元匹配這道題可以使用相同的思路,『?』可以看成對模式字串p進行一次變換操作,『*』匹配兩個或者兩個以上字元可以看成對模式字串p進行插入操作,『*』匹配乙個字元可以看成對p進行一次變換操作,『*』匹配0個字元可以看成對p進行一次刪除操作。使用dp[i][j]=true來表示s的前i個字元、p的前j個字元匹配成功,若dp[i][j]=true,則有三種可能:
dp[i-1][j-1]=true,且s.charat(i-1)==p.charat(j-1);
dp[i][j-1]=true,且p.charat(j-1)=='*',這時表示『*』匹配了0 個字元;
dp[i-1][j]=true,且p.charat(j-1)=='*',這時表示『*』匹配了s的第i個字元;
為了方便,字串的第乙個字元從1開始,**如下:
private static boolean ismatch(string s,string p)
} }return dp[m][n];
}
思路二:
使用貪婪演算法。若模式字串p的第j個字元是『*』,則用 j_start=j,i_start=i 記錄此時『*』和字串s第i個字元的位置,然後跳到『*』的下乙個字元,從p的j+1處,s的i處開始,進行字元匹配(此時相當於『*』匹配了0 個字元);若發現無法完成匹配,則利用j_start i_start記錄的初始位置,從p的j+1處,s的i+1處進行匹配。。。如此迴圈下去,直到完成匹配。
**如下:
private static boolean ismatch(string s,string p)
else
} while(j與動態規劃相比,貪婪演算法的空間複雜度是o(1)。
leetcode。 44 萬用字元匹配
實現乙個支援 和 的萬用字元匹配。匹配任何單個字元。匹配任何數量的字元 包括0個 匹配應覆蓋 整個 輸入字串 而不是部分 這個函式原型為 bool ismatch const char s,const char p 示例 ismatch aa a false ismatch aa aa true i...
LeetCode 44 萬用字元匹配
給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 示例 1 輸入 s aa p a 輸出 false解釋 a 無法匹配 aa 整個字串。示例 2 輸入 s aa p 輸出 true解釋 可以...
LeetCode44 萬用字元匹配
給定乙個字串 s 和乙個字元模式 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。這一題和leetcode10 很像,都是匹配問題,但是有乙個區別,此題裡面的 號並不依賴於前面的乙個字元,可以使用dp,思路參照leetcode44 ...