简单的字符串模拟题

Problem 2183 简单题

Accept: 48    Submit: 236
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

传送门:http://acm.fzu.edu.cn/contest/problem.php?cid=141&sortid=1

现在有一些被简单压缩的字符串,例如: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个字母。

 Sample Input

acb[3]d[5]ebd

 Sample Output

True

 Source

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;
}

一开始我想着要抄别人的代码,后来被学长说要自己做,于是就耐下性子来做,是的,自己做的话也是可以的,只有这样才能不断提高,加油!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值