leetcode:44. 通配符匹配
生活随笔
收集整理的這篇文章主要介紹了
leetcode:44. 通配符匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個字符串?(s) 和一個字符模式?(p) ,實現一個支持?'?'?和?'*'?的通配符匹配。
'?' 可以匹配任何單個字符。 '*' 可以匹配任意字符串(包括空字符串)。兩個字符串完全匹配才算匹配成功。
說明:
s?可能為空,且只包含從?a-z?的小寫字母。 p?可能為空,且只包含從?a-z?的小寫字母,以及字符???和?*。示例?1:
輸入: s = "aa" p = "a" 輸出: false 解釋: "a" 無法匹配 "aa" 整個字符串。
示例?2:
示例?3:
示例?4:
輸入:
s = "adceb" p = "*a*b" 輸出: true 解釋:?第一個 '*' 可以匹配空字符串, 第二個 '*' 可以匹配字符串 "dce".
示例?5:
?
大神果然很多,各種題目都能玩出花樣。 膜拜。。。。。
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());}// 最簡單的版本public static boolean isMatch1(String s, String p){int m = s.length();int n = p.length();s = "a"+s; // 在字符串前面加一個隨意的字符,方便從下標1開始遍歷p = "a"+p;// dp[i][j]表示s的前i個字符是否可以和p的前j個字符匹配int[][] dp = new int[m+1][n+1];dp[0][0] = 1;//當s為空的時候,給[0][i]賦初值for(int x=1; x<=n;x++){if(p.charAt(x) != '*'){break;}dp[0][x] = 1;}//遍歷兩個字符串,為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;}// 優化版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] 即當前'*'匹配一個空字符//dp[i-1][j] 即當前'*'匹配一個字符s.charAt(i-1)//這里之所以不是dp[i-1][j-1]是因為當前'*'可能在前面已匹配了若干個字符// 這里進行優化,不使用循環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;}// 優化版2 時間復雜度 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++; // 這就表示*可以匹配任意長的字符串sp = match;}else{return false;}}// 處理最后字符是*的問題 比如 s = "abcefcb"; p="a*cb*",或者p="a*cb*****"等等while(pp < p.length() && p.charAt(pp) == '*'){pp++;}//System.out.println(match);return pp == p.length();} }?
?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/wildcard-matching
?
?
總結
以上是生活随笔為你收集整理的leetcode:44. 通配符匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】目录文件权限的查看和修改【
- 下一篇: 封装,抽象,继承,多态