题解 | #字符串通配符#
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
//对于‘*’的递归很晕,后面参考的大佬的代码,分成跳过0字符,跳过1字符,跳过n个字符(即*继续匹配) #include <stdio.h> #include <string.h> int dfs(char* ss1,char* ss2) { int len1=strlen(ss1); int len2=strlen(ss2); int i=0; int j=0; for(i=0;i<len1&&j<len2;i++) { if(ss1[i]=='?') j++; else if(ss1[i]==ss2[j]||ss1[i]==ss2[j]+32||ss1[i]==ss2[j]-32) j++; else if(ss1[i]=='*') { while(ss1[i+1]=='*') i++; return dfs(ss1+i+1,ss2+j)||dfs(ss1+i+1,ss2+j+1)||dfs(ss1+i,ss2+j+1); } else return 0; } if(i==len1&&j==len2) return 1; else return 0; } int main() { char s1[101] = { 0 }; char s2[101] = { 0 }; scanf("%s", s1); scanf("%s", s2); int len2 = strlen(s2); int len1 = strlen(s1); int i=0; int j=0; int result=0; while(i<len1||j<len2) { char ss1[101]={0}; char ss2[101]={0}; for(i;i<len1;i++) { if(s1[i]>='A'&&s1[i]<='Z'||s1[i]>='a'&&s1[i]<='z'||s1[i]>='0'&&s1[i]<='9'||s1[i]=='?'||s1[i]=='*') ss1[i]=s1[i]; else break; } for(j;j<len2;j++) { if(s2[j]>='A'&&s2[j]<='Z'||s2[j]>='a'&&s2[j]<='z'||s2[j]>='0'&&s2[j]<='9') ss2[j]=s2[j]; else break; } if(s1[i]==s2[j]) { result = dfs(ss1, ss2); if(result==0) break; } else { result=0; break; } i++; j++; } if(result==1) printf("true\n"); else printf("false\n"); return 0; }