NYOJ 359 Delete it 字符串处理

Delete it

时间限制: 2000 ms  |  内存限制: 65535 KB
难度: 2
描述

克林在打一行字母时总是会打多一个字符,比如想打july”时会打成juuly”,这样他需要删掉其中一个u’

克林想知道他可以删掉哪个位置的字符就可以变成他真正想打的一行字母。

输入
第一行一个整数:T (测试个数)

每个测试
输入两行,两个字符串(全是小写字母)
串长为 1 到 1000000
第一个串长度刚好比第二个的长度大一
输出
每个测试数据:
第一行输出可以删除的位置个数 P
如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)
样例输入
3
juuly
july
abc
zz
aa
a

样例输出

2
2 3
0
2
1 2
      从第一个位置开始比较,直到找到不相等的位置,记录不相等的位置,然后错位比较,如果又找到一处不相等的位置,即不相等的位置个数超过1个,跳出循环,输出0;然后用第一个字符串的最后一个元素一次与前面元素比较,如果相等,删除点个数加1,否则跳出循环。

 
#include<stdio.h>
#include<string.h>
char s1[1000001],s2[1000001];
int main()
{
	int n,i,j,p,cnt,len1,len2,sum;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",s1);
		scanf("%s",s2);
		len1=strlen(s1);
		len2=len1-1;
		p=i=j=cnt=0;
		while(i<len1&&j<len2)
		{
			if(s1[i]!=s2[j])
			{
				p=i; //记录第一个不相等的位置
				cnt++; //不等位置数量加1
				if(cnt>1) 
				    break;
				i++; //错位比较
			}
			else
			{i++;j++;}

		}
		if(cnt>1)//不相等数量大于1,都不能删除
			printf("0\n");
        sum=0; //记录删除点的个数
        if(cnt==0)  /*abcd abc*/
        {
            for(i=len1-2;i>=0;i--) //从倒数第二个元素开始,每次都和最后一个元素比较
            {
                if(s1[i]==s1[len1-1])
					sum++; 
				else
					break;
            }
			printf("%d\n",sum+1);
			for(j=i+2;j<=len1;j++) //i记录与最后一个元素不等元素的位置,从i后一个开始输出,下标加1,最后一个元素位置为len1
			  printf("%d ",j);
			printf("\n");
        }
        else if(cnt==1)
        {
            for(i=p-1;i>=0;i--) //从第一个不等位置往前与a[p]比较
            {
                if(s1[i]==s1[p])
                    sum++;
                else break;
            }
            printf("%d\n",sum+1);
            for(j=i+2;j<=p+1;j++)
               printf("%d ",j);
            printf("\n");
		}
	}
	return 0;
}



        


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值