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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

leetcode:44. 通配符匹配

發(fā)布時(shí)間:2025/6/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode:44. 通配符匹配 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

給定一個(gè)字符串?(s) 和一個(gè)字符模式?(p) ,實(shí)現(xiàn)一個(gè)支持?'?'?和?'*'?的通配符匹配。

'?' 可以匹配任何單個(gè)字符。 '*' 可以匹配任意字符串(包括空字符串)。

兩個(gè)字符串完全匹配才算匹配成功。

說(shuō)明:

s?可能為空,且只包含從?a-z?的小寫(xiě)字母。 p?可能為空,且只包含從?a-z?的小寫(xiě)字母,以及字符???和?*。

示例?1:

輸入: s = "aa" p = "a" 輸出: false 解釋: "a" 無(wú)法匹配 "aa" 整個(gè)字符串。


示例?2:

輸入: s = "aa" p = "*" 輸出: true 解釋:?'*' 可以匹配任意字符串。


示例?3:

輸入: s = "cb" p = "?a" 輸出: false 解釋:?'?' 可以匹配 'c', 但第二個(gè) 'a' 無(wú)法匹配 'b'。


示例?4:

輸入:

s = "adceb" p = "*a*b" 輸出: true 解釋:?第一個(gè) '*' 可以匹配空字符串, 第二個(gè) '*' 可以匹配字符串 "dce".


示例?5:

輸入: s = "acdcb" p = "a*c?b" 輸出: false

?

大神果然很多,各種題目都能玩出花樣。 膜拜。。。。。

package com.atchina;public class WildCardMatching {public static void main(String[] args) {String s = "acdcb";String p = "a*b";System.out.printf("isMatch1: %s is match %s: %b\n", s, p, isMatch1(s, p));System.out.printf("isMatch2: %s is match %s: %b\n", s, p, isMatch2(s, p)); // System.out.println(ss.charAt(0) == '1'); // System.out.println(ss.length());}// 最簡(jiǎn)單的版本public static boolean isMatch1(String s, String p){int m = s.length();int n = p.length();s = "a"+s; // 在字符串前面加一個(gè)隨意的字符,方便從下標(biāo)1開(kāi)始遍歷p = "a"+p;// dp[i][j]表示s的前i個(gè)字符是否可以和p的前j個(gè)字符匹配int[][] dp = new int[m+1][n+1];dp[0][0] = 1;//當(dāng)s為空的時(shí)候,給[0][i]賦初值for(int x=1; x<=n;x++){if(p.charAt(x) != '*'){break;}dp[0][x] = 1;}//遍歷兩個(gè)字符串,為dp[i][j]依次賦值//dp[i][j]=true有三種可能//(1)dp[i-1][j-1]=true并且s.charAt(i-1)=p.charAt(j-1) 或者p.charAt(j-1) = ‘?’//(2)dp[i][j-1]=true并且p.charAt(j-1)="*"//(3)dp[i-1][j]=true并且p.charAt(j-1)="*"// s = "acdcb";// p = "a*b"for (int i=1; i<=m; i++){for(int j=1; j<=n;j++){if(p.charAt(j) == '?'){dp[i][j] = dp[i-1][j-1];}else if(p.charAt(j)== '*'){for(int k=0; k<=i; k++){if(dp[k][j-1] == 1){dp[i][j] = 1;}}}else if(s.charAt(i) == p.charAt(j)){dp[i][j] = dp[i-1][j-1];}}}return dp[m][n] == 1 ? true : false;}// 優(yōu)化版1public static boolean isMatch2(String s, String p){int m = s.length();int n = p.length();s = "a"+s;p = "a"+p;int[][] dp = new int[m+1][n+1];dp[0][0] = 1;for(int x=1; x<=n;x++){if(p.charAt(x) != '*'){break;}dp[0][x] = 1;}// s = "acdcb";// p = "a*b"for (int i=1; i<=m; i++){for(int j=1; j<=n;j++){if(p.charAt(j) == '?'){dp[i][j] = dp[i-1][j-1];}else if(p.charAt(j)== '*'){ // for(int k=0; k<=i; k++){ // if(dp[k][j-1] == 1){ // dp[i][j] = 1; // } // }//dp[i][j-1] 即當(dāng)前'*'匹配一個(gè)空字符//dp[i-1][j] 即當(dāng)前'*'匹配一個(gè)字符s.charAt(i-1)//這里之所以不是dp[i-1][j-1]是因?yàn)楫?dāng)前'*'可能在前面已匹配了若干個(gè)字符// 這里進(jìn)行優(yōu)化,不使用循環(huán)if(dp[i][j-1]== 1 || dp[i-1][j]== 1){dp[i][j] = 1;}else{dp[i][j] = 0;}}else if(s.charAt(i) == p.charAt(j)){dp[i][j] = dp[i-1][j-1];}}}return dp[m][n] == 1 ? true : false;}// 優(yōu)化版2 時(shí)間復(fù)雜度 O(n)public static boolean isMatch(String s, String p){int sp = 0;int pp = 0;int match = 0;int start = -1;while(sp<s.length()){if(pp<p.length() && (s.charAt(sp) == p.charAt(pp) || p.charAt(pp) == '?')){sp++;pp++;}else if(pp<p.length() && p.charAt(pp) == '*'){start = pp;match = sp;pp++;}else if(start != -1){pp = start + 1;match++; // 這就表示*可以匹配任意長(zhǎng)的字符串sp = match;}else{return false;}}// 處理最后字符是*的問(wèn)題 比如 s = "abcefcb"; p="a*cb*",或者p="a*cb*****"等等while(pp < p.length() && p.charAt(pp) == '*'){pp++;}//System.out.println(match);return pp == p.length();} }

?

?

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/wildcard-matching
?

?

總結(jié)

以上是生活随笔為你收集整理的leetcode:44. 通配符匹配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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