现在有一些被简单压缩的字符串,例如:a[120]代表120个a。对于字符串acb[3]d[5]e相对于acbbbddddde
现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩。
求nString是否为cString的子串,如果是输出True,否则输出False.cString的长度clen的范围是0<clen<1000, nString的长度的nlen的范围是0<nlen<1000;cString只包含小写26个字母,[],数字(大于0小于10^9)。nString只包含小写26个字母。
FOJ有奖月赛-2015年03月
一开始一直错,也不知道为什么,后来才发现是少加了while(scanf("%s%s",str1,str2)!=EOF) 感觉被骗了 呵呵
这道题的思路:
就是把数字和字符分开来存放,然后这样就好判断了
#include<stdio.h> #include<string.h> char str1[1500],str2[1500]; char string1[1234567],string2[1234567]; //i是数字的起始位置,j是数字的终结位置; 用来求a串的数字; int change(int i,int j){ int ans=0,l=1; for(int k=j;k>=i;k--){ ans+=(str1[k]-'0')*l; l=l*10; } return ans; } int main(){ int l1,l2; int i,j,k=0; while(~scanf("%s%s",str1,str2)){ l1=strlen(str1); l2=strlen(str2); int num1[1500]={0},num2[1500]={0}; char c; int num=0; for(i=0;i<l1;i++){ if(i==0){ c=str1[i]; string1[k]=c; if(str1[i+1]=='['){ for(j=i+2;;j++) if(str1[j]==']') break; int ans=change(i+2,j-1); num1[k]+=ans; } else num1[k]++; } else { if(str1[i]==c){ if(str1[i+1]=='['){ for(j=i+2;;j++) if(str1[j]==']') break; int ans=change(i+2,j-1); num1[k]+=ans; } else num1[k]++; } else if(str1[i]!=c&&str1[i]>='a'&&str1[i]<='z'){ k++; c=str1[i]; string1[k]=c; if(str1[i+1]=='['){ for(j=i+1;;j++) if(str1[j]==']') break; int ans=change(i+2,j-1); num1[k]=ans; } else num1[k]++; } } } string1[k+1]='\0'; /* printf("%d\n",len1); for(i=0;i<=k;i++){ printf("%c %d\n",string1[i],num1[i]); } */ int len1=k+1; //change str2; (也就是b串) k=0; for(i=0;i<l2;i++){ char temp=str2[i]; int num=1; while(str2[i]==str2[i+1]){ num++; i++; } num2[k]=num; string2[k]=temp; k++; } string2[k]='\0'; int len2=k; //代表string2中有几个字符; //接下来要判断了; //printf("%d %d\n",len1,len2); k=0; int p,q,flag=1; for(i=0;i<len1;i++){ flag=1; if(string1[i]==string2[k]){ //len2==1; if(len2==1){ if(num1[i]>=num2[k]) {flag=1; puts("True"); break;} else {flag=0; continue;} } else if(len2>1){ for(p=k+1,q=i+1;p<=len2-2;p++,q++){ if((string1[q]!=string2[p])||(string1[q]==string2[p] && num1[q]!=num2[p])){ flag=0; break; } //printf("%d\n",flag); } //printf("%d %d\n",p,q); if(flag){ if((string1[i]==string2[k]&&num1[i]>=num2[k]) && (string1[q]==string2[p]&&num1[q]>=num2[p])) {flag=1; puts("True"); break;} else flag=0; } } if(flag) break; if(!flag) {continue;} } } if(i==len1) puts("False"); } return 0; }
原文:http://blog.csdn.net/acmer_hades/article/details/44563119