带通配符的字符串匹配(动态规划)

OJ地址:http://noi.openjudge.cn/ch0206/6252/

 1 #include<string>
 2 #include<cstdio>
 3 #include<iostream>
 4 using namespace std;
 5 string A,B;
 6 bool Judge(int a,int b);
 7 void Init();
 8 int main()
 9 {
10 //    cin>>A>>B;//A with ? or *
11     getline(cin,A);getline(cin,B);
12     Init();
13     cout<<(Judge(A.length()-1,B.length()-1)?"matched":"not matched");
14     return 0;
15 }
16 void Init()
17 {
18     string Temp("");
19     for(int i=0;i<A.length();i++){
20         if(Temp[Temp.length()-1]==‘*‘&&A[i]==‘*‘) continue;
21         Temp=Temp+A[i];
22     }
23     A=Temp;
24 }
25 bool Judge(int a,int b)
26 {
27     //if(A==B) return true;
28     if(A.empty()&&B.empty()) return true;
29     if(A[a]==‘*‘){
30         if(a==0) return true;
31         int n=b;
32         /*do{
33             if(n==-1) return false;
34             if(Judge(a-1,n)) return true;
35         }while(n--);*/
36         while(n>=0){
37             if(Judge(a-1,n)) return true;
38             n--;
39         }
40         return false;
41     }
42     if(A[a]==B[b]||A[a]==‘?‘){
43         if(a==0&&b==0) return true;
44         else if(a==0||b==0){
45             if(a==1&&A[0]==‘*‘) return true;
46             return false;
47         }
48         else return Judge(a-1,b-1);
49     }
50     return false;
51 }
时间: 2024-12-25 14:01:17

带通配符的字符串匹配(动态规划)的相关文章

COJN 0558 800600带通配符的字符串匹配

800600带通配符的字符串匹配 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符.你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配.例如,1?456 可以匹配 12456.13456.1a45

openjudge6252 带通配符的字符串匹配

描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符. 你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配. 例如,1?456 可以匹配 12456.13456.1a456,但是却不能够匹配23456.1aa456: 2*77?8可以匹配 24457798.237708.27798. 输入输入有两行,每行为一个不

带通配符的字符串匹配问题

1 /* 2 不使用c,c++库,?表示任意一个,*表示>=0任意,匹配规则要求匹配最大的字符子串,例如a*d ,匹配abbdd而非abbd,即最大匹配字符串 3 input :abcadefg 4 reule : a?c 5 ouput : abc 6 7 input : newsadfanewfdsdsf 8 rule :new 9 output: new new(最后一个不带空格,中间用空格分隔) 10 11 input : breakfastfood 12 rule : f*d 13 o

动态规划 | 带有通配符的字符串匹配(浅显易懂)

带有通配符的字符串匹配 一.Leetcode | 44 Wildcard Matching(只有一个字符串包含通配符) 题目很简单,就是说两个字符串,一个含有通配符,去匹配另一个字符串:输出两个字符串是否一致. 注意:'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次 首先,我们想到暴力破解.如果从头到尾的破解,到第二个字符时,是否匹配成功取决于第一个字符是否匹配成功! 所以我们想到应该要用到动态规划: 既然用到动态规划,最重要的是设置初值 和找到递推式: 于是,我们开始分析初值怎么设

[OpenJudge]带有通配符的字符串匹配

#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; /* 字符串匹配 ?代表一个字符(不能没有),*可以代表任意多个字符(可以为空) ?表示任意字符,也就是说?永远可以匹配成功,本质上,只要遇到?就一定匹配 *的本质,是分割字符串,即如果P=P1*P2,即P得匹配条件是匹配P1串之后,再匹配P2子串 */ //@param  src[], 带匹配的字符串 //@

含有通配符的字符串匹配

字符串匹配问题,给定两个字符串.求字符串2.在字符串1中的最先匹配结果.字符串2中能够存在'*'符号,且该符号能够代表随意字符,即字符串2中存在通配符. e.g. 输入:abcdefghabef, a*f 输出:abcdef #include <iostream> #include <string> using namespace std; bool Match(const string &s1,const string &s2,string &result

含通配符的字符串匹配问题

题目: 给定两个字符串,求字符串2,在字符串1中的最先匹配结果.字符串2中 可以存在'*'符号,且该符号可以代表任意字符,即字符串2中存在通配符. 例如:输入:abcdefghabef,a*f 输出:abcdef #include<iostream> #include<string> using namespace std; int main() { int i=0,len=0,len1,len2,j=0,begin=0; string s,s1,s2,s3; getline(ci

【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配

问题:当工作在Linux shell下时,使用常见的通配符模式(即,*.py.Dat[0-9]*.csv等)来对文本做匹配 解决方案:fnmatch模块提供的两个函数fnmatch().fnmatchcase() #fnmatch()的匹配模式所采用的大小写区分规则和底层文件系统相同(根据操作系统的不同 而不同) #fnmatchcase()的匹配模式区分大小写 >>> from fnmatch import fnmatch,fnmatchcase >>> fnmatc

Python实用技法第22篇:利用Shell通配符做字符串匹配

1.需求 当工作在UNIX Shell下时,我们想使用常见的通配符模式(即:.py,Dat[0-9].csv等)来对文本做匹配. 2.解决方案 fnmatch模块提供了两个函数:fnmatch()和fnmatchcase(),可用来执行这样的匹配,使用起来非常简单. 实例: from fnmatch import fnmatch,fnmatchcase print(fnmatch('mark.txt','*.txt')) print(fnmatch('mark.txt','?ark.txt'))