给出两个字符串,分别是模式串P和目标串T,判断模式串和目标串是否匹配,匹配输出 1,不匹配输出 0。模式串中‘?’可以匹配目标串中的任何字符,模式串中的 ’*’可以匹配目标串中的任何长度的串,模式串的其它字符必须和目标串的字符匹配。例如P=a?b,T=acb,则P 和 T 匹配。
给出两个字符串,分别是模式串P和目标串T,判断模式串和目标串是否匹配,匹配输出 1,不匹配输出 0。模式串中‘?’可以匹配目标串中的任何字符,模式串中的 ’*’可以匹配目标串中的任何长度的串,模式串的其它字符必须和目标串的字符匹配。例如P=a?b,T=acb,则P 和 T 匹配。
输入第一行包含一个字符串p, (1 ≤ |p| ≤ 20).
输入第二行包含一个字符串t, (1 ≤ |t| ≤ 20).
输出仅包含0和1的整数,0表示p和t不匹配,1表示p和t匹配。
a?b ab
0
a*b ab
1
a*b a(cb
1
保证T中不包含 ‘*’ 字符和 ‘?’ 字符
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String p = sc.next(); String s = sc.next(); // System.out.println(s + " - " + p); int m = s.length(), n = p.length(); boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; for(int i = 1; i <= n; i++) dp[0][i] = dp[0][i - 1] && p.charAt(i - 1) == '*'; for(int i = 1; i <= m; i++){ for(int j = 1; j <= n; j++){ if(s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?'){ dp[i][j] = dp[i - 1][j - 1]; } if(p.charAt(j - 1) == '*'){ dp[i][j] = dp[i - 1][j] || dp[i][j - 1]; } } } System.out.println((dp[m][n] ? 1 : 0)); } }
#include <iostream> (720)#include <string> using namespace std; int compare(string &strS, string &strT, int i, int j) { if (i >= strS.size()) { if (j >= strT.size()) return 1; return 0; } else if (j >= strT.size()){ for (int k = i; k < strS.size(); k++) if (strS[k] != '*') return 0; return 1; } if (strS[i] == '*') { for (int k = j; k <= strT.size(); k++) if (compare(strS, strT, i+1, k)) return 1; return 0; } if (strS[i] == '?') { if (compare(strS, strT, i+1, j+1)) return 1; return 0; } if (strS[i] == strT[j]) return compare(strS, strT, i+1, j+1); return 0; } int main() { string strS, strT; cin >> strS >> strT; cout << compare(strS, strT, 0, 0) << '\n'; return 0; }
import java.util.regex.Pattern; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String p = scanner.nextLine(); String t = scanner.nextLine(); if (Pattern.matches(p.replace("*",".*").replace("?","."),t)){ System.out.println(1); }else { System.out.println(0); } } }
#include<iostream> #include<vector> #include<string> using namespace std; bool match(char a, char b) { return a == b || a == '?'; } int main() { string p, t; cin >> p >> t; int m = t.size(); int n = p.size(); vector<vector<bool>> dp(m+1, vector<bool>(n+1, false)); dp[0][0] = true; for (int i = 1;i < m + 1;i++) { for (int j = 1;j < n + 1;j++) { if (p[j-1] == '*') { if (j == 1) dp[i][j] = true; dp[i][j] = dp[i-1][j] || dp[i][j]; dp[i][j] = dp[i][j-1] || dp[i][j]; } else if (match(p[j-1], t[i-1])) { dp[i][j] = dp[i-1][j-1]; } } } int ret = dp[m][n] ? 1 : 0; cout << ret << endl; return 0; }
def dfs(s1, s2, p1, p2): # s1或s2结束 if p1>=len(s1): return p2>=len(s2) elif p2>=len(s2): return s1[p1] == "*" and dfs(s1, s2, p1 + 1, p2) # s2结束,只有*能匹配空 # 都未结束 if s1[p1]!="*": if s1[p1]=="?": return dfs(s1, s2, p1+1, p2+1) else: return s1[p1]==s2[p2] and dfs(s1, s2, p1+1, p2+1) else: # 为*可以匹配任意长度 flag = False for i in range(0, len(s2)-p2+1): flag = flag&nbs***bsp;dfs(s1, s2, p1+1, p2+i) return flag s1 = input() s2 = input() if dfs(s1, s2, 0, 0): print(1) else: print(0)
#include <iostream> #include <string> using namespace std; int main() { string p, t; cin >> p >> t; auto iter_t = t.begin(); for (auto iter_p = p.begin(); iter_p != p.end(); iter_p++) { if (iter_t == t.end()) { cout << "0" << endl; return 0; } if (*iter_p == '?') { iter_t++; } else if (*iter_p == '*') { while (*iter_p == '*') { iter_p++; } if (iter_p == p.end()) { cout << "1" << endl; return 0; } else { while (iter_t != t.end() && *iter_t != *iter_p) { iter_t++; } if (iter_t == t.end()) { cout << "0" << endl; return 0; } else { iter_t++; } } } else if (*iter_p == *iter_t) { iter_t++; } else { cout << "0" << endl; return 0; } } if (iter_t == t.end()) { cout << "1" << endl; } else { cout << "0" << endl; } return 0; }
#include <bits/stdc++.h> using namespace std; int main() { string p, t; cin >> p >> t; int n = p.size(), m = t.size(); int i = 0, j = 0; int ii = -1, jj = -1; while (j < m) { if (p[i] == '*') { ii = ++i; jj = j; } else if (p[i] == t[j] || p[i] == '?') { ++i; ++j; } else if (ii == -1) { cout << "0\n"; return 0; } else { i = ii; j = ++jj; } } while (i < n && p[i] == '*') ++i; cout << (i == n ? "1" : "0") << "\n"; }
暴力匹配: private static int match(String str1, String str2) { char[] chars1 = str1.toCharArray(); char[] chars2 = str2.toCharArray(); int pLength = chars1.length; int tLength = chars2.length; int i = 0; int j = 0; boolean flag = false; while (true) { if (i >= chars1.length && j >= chars2.length) { flag = true; break; } if ("?".equals(chars1[i] + "")) { i++; j++; } else if ("*".equals(chars1[i] + "")) { if(i < pLength - 1){ if("*".equals(chars1[i + 1] + "")){ i++; continue; } while (i < pLength - 1 && j < tLength && chars1[i + 1] != chars2[j]){ j++; } if(j == tLength){ //没有找到下一位跟chars1[i + 1]相等的存在 flag = false; break; } i++; }else{ flag = true; break; } } else { if ( i < pLength && j < tLength && chars1[i] == chars2[j]) { i++; j++; } else { break; } } } return flag ? 1 : 0; }
p = input().strip() t = input().strip() def DFS(p,t,i,j): if i == len(p) and j == len(t): return True if i == len(p): return False if j == len(t): return False if p[i] not in ['*','?']: if p[i] != t[j]: return False else: if DFS(p,t,i+1,j+1): return True else: if p[i] == '*': if DFS(p,t,i,j+1)&nbs***bsp;DFS(p,t,i+1,j+1)&nbs***bsp;DFS(p,t,i+1,j): return True else: if DFS(p,t,i+1,j+1): return True if DFS(p,t,0,0): print(1) else: print(0)
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String pattern = scanner.nextLine(); String str = scanner.nextLine(); Boolean res = match(str, pattern, 0, 0); System.out.println(res?"1":"0"); } static Boolean match(String str, String pattern, int i, int j){ if (i>=str.length() && j>=pattern.length()) return true; if (i<str.length() && j>=pattern.length()) return false; if (pattern.charAt(j)=='*') { return (i<str.length() && match(str, pattern, i+1, j)) || match(str, pattern, i, j+1); } if ((i<str.length() && str.charAt(i)==pattern.charAt(j)) || (pattern.charAt(j)=='?' && i<=str.length())) { return match(str, pattern, i+1, j+1); } return false; } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String T = scanner.nextLine(); String P = scanner.nextLine(); char []strP = P.toCharArray(); char []strT = T.toCharArray(); int lenP = strP.length; int lenT = strT.length; int [][]dp = new int[lenT+1][lenP+1]; dp[0][0]=1; if(strT[0]=='*') dp[1][0]=1; for (int i = 1; i < lenT+1; i++) { int ii=i-1; if (strT[ii]!='*' ){ for (int j = 1; j < lenP+1; j++) { if( strT[ii]==strP[j-1]||strT[ii]=='?' ){ dp[i][j]=dp[i-1][j-1]; } } } else if(strT[ii]=='*'){ for (int j = 1; j < lenP+1; j++) { if(dp[i-1][j]==1||dp[i][j-1]==1){ dp[i][j]=1; } } } } System.out.println(dp[lenT][lenP]); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String p = sc.nextLine(); String t = sc.nextLine(); p = p.replace("?","."); p = p.replace("*",".{0,}"); if(t.matches("^"+p+"$")){ System.out.print(1); } else { System.out.print(0); } } }
import java.util.*; public class Main { public static void main(String[] args){ System.out.print(result()); } public static int result(){ Scanner sc = new Scanner(System.in); String str=sc.nextLine(); String str2=sc.nextLine(); char[] strArray=str.toCharArray(); char[] strArray2=str2.toCharArray(); int arrayseq=0; for(int i=0;i<strArray.length;i++){ if(strArray[i]=='?'){ arrayseq++; continue; } else if(strArray[i]=='*'){ while (true){ if (i<strArray.length-1&& strArray[i+1]=='*') { i++; } else { break; } } if(i==strArray.length-1){ return 1; } else{ for(int j=arrayseq;j<strArray2.length;j++){ if(strArray[i+1]==strArray2[j]){ arrayseq=j-1; break; } } } } else{ if(strArray[i]!=strArray2[arrayseq]){ return 0; } } arrayseq++; if ((i+1)==strArray.length-1&&arrayseq<strArray2.length-1){ return 0; } else if (arrayseq==strArray2.length-1&&(i+1)<strArray.length-1){ return 0; } } return 1; } }
import java.util.Scanner; public class Main { public static void main(String[] args) { regixMatch(); } private static void regixMatch(){ Scanner scanner = new Scanner(System.in); String p = scanner.next(); String t = scanner.next(); int pLen = p.length(), tLen = t.length(); boolean[][] dp = new boolean[pLen][tLen]; for(int i = pLen - 1; i >= 0; i--){ for(int j = tLen - 1; j >= 0; j--){ if(p.charAt(i) == '*'){ if(i + 1 == pLen) dp[i][j] = true; else{ for(int k = j; k < tLen; k++){ dp[i][j] = dp[i][j] || dp[i + 1][k]; } } continue; } boolean isMatch = p.charAt(i) == t.charAt(j) || p.charAt(i) == '?'; if(i + 1 == pLen && j + 1 == tLen) { dp[i][j] = isMatch; } else if(i + 1 < pLen && j + 1 < tLen){ dp[i][j] = isMatch && dp[i + 1][j + 1]; }else { dp[i][j] = false; } } } int rst = dp[0][0] ? 1 : 0; System.out.println(rst); } }
#include<iostream> #include<string> using namespace std; bool match(int& i, int& j, string& p, string& t); bool xmatch(int& i, int& j, string& p, string& t); int main() { string p, t; int i = 0, j = 0; cin >> p >> t; if (match(i, j, p, t)) { cout << '1'; } else{ cout << '0'; } return 0; } bool match(int& i, int& j, string& p, string& t) { while (i < p.length() && j < t.length()) { if (p[i] == t[j] || p[i] == '?') { i++; j++; } else if (p[i] == '*') { if (!xmatch(i, j, p, t)) { return false; } } else { return false; } } if (i == p.length() && j == t.length()) { return true; } else { return false;; } } bool xmatch(int &i, int &j, string &p, string &t) { if (++i == p.length()) { j = t.length(); return true; } for (; j < t.length(); j++) { if (match(i, j, p, t)) { return true; } } return false; }递归思想