BD5. 字符串匹配
描述
牛牛有两个字符串A和B,其中A串是一个01串,B串中除了可能有0和1,还可能有'?',B中的'?'可以确定为0或者1。 寻找一个字符串T是否在字符串S中出现的过程,称为字符串匹配。牛牛现在考虑所有可能的字符串B,有多少种可以在字符串A中完成匹配。输入描述
输入包括两行,第一行一个字符串A,字符串A长度length(1 ≤ length ≤ 50),A中每个字符都是'0'或者'1'。 第二行一个字符串B,字符串B长度length(1 ≤ length ≤ 50),B中的字符包括'0','1'和'?'。输出描述
输出一个整数,表示能完成匹配的字符串种数。示例1
输入:
00010001 ??
输出:
3
C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2020-09-09
#include <stdio.h> #include <stdlib.h> #include <string.h> int str_cmp(char *a1,char *a2,int len){ int i; int flag = 1; if(a1 ==NULL || a2 == NULL ||len < 0) { printf("params error.\n"); exit(-1); } for(i = 0; i < len ;i++) { if(a1[i]!=a2[i] && a2[i]!='?') { flag = 0; break; } } return flag; } int main(){ int i,j,counter =0; int len_main = 0,ind = 0; int len_sub= 0,count = 0,res = 0; char main_str[50]; char sub_str[50]; char str_tmp[50]; char save[50][50]; scanf("%s", main_str); scanf("%s", sub_str); len_main = strlen(main_str); len_sub = strlen(sub_str); ind = 0; if(len_sub > len_main) { return 0; } else { while(ind <= len_main - len_sub) { for(i = ind ;i < ind+len_sub ;i++) { str_tmp[i-ind] =main_str[i]; } str_tmp[len_sub] ='\0'; ind++; res = str_cmp(str_tmp,sub_str,len_sub); if(res != 1) continue; for(i = 0; i< 50 ;i++) { if(strcmp(str_tmp,save[i])==0) { break; } } if(i ==50) { count ++; strcpy(save[counter], str_tmp); counter++; } } } printf("%d \n",count); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2020-06-07
#include<stdio.h> #include<string.h> #define MAX 55 char str[55][55]; int ans = 0; int analyze(char str[][MAX],char * tmp,int anss)//比较两个字符串 字符串 要比较的字符 数量 { int i; for(i=0;i<anss;i++){ if(strcmp(str[i],tmp)==0) return 0; } return 1; } int get_cnt(char sr[][MAX], char * B,int N) { int i,j,cnt,flag; cnt = 0; for(i=0;i<ans;i++){ flag = 1; for(j=0;j<N;j++) if(str[i][j]!=B[j] && B[j]!='?') {flag = 0;break;} if(flag == 1) cnt++; } return cnt; } int main() { char A[MAX],B[MAX]; int lena; int lenb; int i; int j=0; int l; int r; char tmp[MAX]; int cnt; scanf("%s", A); scanf("%s", B); lena = strlen(A); lenb = strlen(B); l = 0; r = lenb; while(r<=lena) { j=0; for(i=l;i<=r-1;i++) { tmp[j++]=A[i]; } if(analyze(str,tmp,ans)) strcpy(str[ans++],tmp); l++; r++; } cnt = get_cnt(str,B,lenb);//这里 printf("%d", cnt); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-11-14
#include <stdio.h> #include <string.h> int compare(char* A, char* B, int b_len){ int i; for(i = 0; i < b_len; i++){ if(B[i] == '?')continue; if(B[i] != A[i])return 0; } return 1; } int main(){ char* A = (char*)malloc(51*sizeof(char)); char* B = (char*)malloc(51*sizeof(char)); while(scanf("%s", A) != EOF){ scanf("%s", B); int a_len = strlen(A); int b_len = strlen(B); int n = 0; int flag = 0; char* temp = (char*)malloc(50*sizeof(char)); char** store = (char**)malloc(50*sizeof(char*)); //char store[50][51]; for(int i = 0; i <= a_len - b_len; i++){ if(compare((char*)(A + i), B, b_len) == 1){ flag = 0; strcpy(temp, (char *)(A+i)); temp[b_len] = '\0'; for(int j = 0; j < n; j++){ if(strcmp(temp, store[j]) == 0){ flag = 1; break; } } if(flag == 1)continue; store[n] = (char *)malloc(51*sizeof(char)); strcpy(store[n], temp); n++; } } printf("%d\n", n); for(int i = 0; i < n; i++){ free(store[i]); } free(store); } }
C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2019-07-22
#include<stdio.h> #include<string.h> #define MAX 55 char str[55][55]; int ans = 0; int analyze(char str[][MAX],char * tmp,int anss)//比较两个字符串 字符串 要比较的字符 数量 { int i; for(i=0;i<anss;i++){ if(strcmp(str[i],tmp)==0) return 0; } return 1; } int get_cnt(char sr[][MAX], char * B,int N) { int i,j,cnt,flag; cnt = 0; for(i=0;i<ans;i++){ flag = 1; for(j=0;j<N;j++) if(str[i][j]!=B[j] && B[j]!='?') {flag = 0;break;} if(flag == 1) cnt++; } return cnt; } int main() { char A[MAX],B[MAX]; int lena; int lenb; int i; int j=0; int l; int r; char tmp[MAX]; int cnt; scanf("%s", A); scanf("%s", B); lena = strlen(A); lenb = strlen(B); l = 0; r = lenb; while(r<=lena) { j=0; for(i=l;i<=r-1;i++) { tmp[j++]=A[i]; } if(analyze(str,tmp,ans)) strcpy(str[ans++],tmp); l++; r++; } cnt = get_cnt(str,B,lenb);//这里 printf("%d", cnt); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2019-05-26
#include<stdio.h> #include<string.h> #define MAX 55 char str[55][55]; int ans = 0; int analyze(char str[][MAX],char * tmp,int anss) { int i; for(i=0;i<anss;i++){ if(strcmp(str[i],tmp)==0) return 0; } return 1; } int get_cnt(char sr[][MAX], char * B,int N) { int i,j,cnt,flag; cnt = 0; for(i=0;i<ans;i++){ flag = 1; for(j=0;j<N;j++) if(str[i][j]!=B[j] && B[j]!='?') {flag = 0;break;} if(flag == 1) cnt++; } return cnt; } int main() { char A[MAX],B[MAX]; int lena; int lenb; int i; int j; int l; int r; char tmp[MAX]; int cnt; scanf("%s", A); scanf("%s", B); lena = strlen(A); lenb = strlen(B); l = 0;r = lenb; while(r<=lena){ for(i=l,j=0;i<=r-1;i++,j++) tmp[j]=A[i]; if(analyze(str,tmp,ans)) strcpy(str[ans++],tmp); l++;r++; } cnt = get_cnt(str,B,lenb);//这里 printf("%d", cnt); return 0; }