10.肥宅快乐串

Description

龙龙在研究字符串和字符串处理。龙龙发现有一些字符串让他第一眼看到就会发自内心的感到快乐,他把这些字符串称为“肥宅快乐串"。龙龙进一步研究发现,一个字符串是"肥宅快乐串",当且仅当这个字符串存在至少一个子串是"fattyhappy"。字符串的子串是指这个字符串中截下来的连续的一段。比如"fffffattyhappyyyyy"就有一个"fattyhappy"子串,而"faaaaattyhappy"就没有一个"fattyhappy"子串。现在龙龙看到了好多个字符串,他想对每一个字符串交换恰好一对字符的位置,使得这个字符串变成"肥宅快乐串"。请注意:必须进行一次交换,不允许不交换。龙龙真的很想见到"肥宅快乐串",请你帮帮龙龙吧,告诉他应该交换字符串里哪两个位置的字符。

Input

输入共有 T 加 1 行,其中 T 空格 左括号 1 小於等於 T 小於等於 1000 右括号 表示需要你进行操作的字符串个数;

第一行一个正整数T;

接下来第 2 到第 T 加 1 行,每行输入一个字符串,表示需要你帮忙变成"肥宅快乐串"的原来的字符串,一共有 T 行。

Output

输出 T 行,表示这 T 个字符串的交换方案。对于每个字符串,如果有解,输出两个数 i 逗號 j,表示交换字符串的第 i 个和第 j 个字符。否则输出一个数 負 1,表示没有方案。如果有多种方法使得它变成"肥宅快乐串",输出任意一种即可。

Note

所有数据保证 1 小於等於 T 小於等於 1000 空格 逗號 空格 竖线 s 下標 i 竖线 小於等於 1000 逗號 加總 從 i 對 竖线 s 下標 i 竖线 小於等於 10 的 5 次方。即单个字符串长度不超过 1000,所有字符串总长度不超过 10 的 5 次方。保证字符串中只有小写字母出现。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 5↵
  2. fafttyhappy↵
  3. fiftyhappy↵
  4. fattyahppy↵
  5. fattypahpy↵
  6. pattyhafpy↵
以文本方式显示
  1. 2 3↵
  2. -1↵
  3. 6 7↵
  4. 6 8↵
  5. 1 8↵
1秒64M0

思路

这题乍一看挺费事,但实际也就四种情况:有完整的快乐串,差一个字符,差两个字符,差三个及以上。

1.交换相同字母 t和t

2.检查这10个字母以外是否有需要的字母

3.检查这两个字符交换后是否满足

4.直接否掉

具体的步骤为两重循环。外层遍历字符串(注意边界条件 lenth-10)内层循环检查十个字母。可以设一些变量来记录与快乐串不同字符的个数以及位置。然后根据四种情况执行。

代码

#include<stdio.h>
#include<string.h>
#define N 1005
main()
{
	char a[N],b[]="fattyhappy",c[15],temp;
	int t,i,j,k,l,same,d[15]={0},x,y,flag;
	char *m;
	scanf("%d%*c",&t);
	while(t--){
		memset(a,0,sizeof(a));
		gets(a);
		l=strlen(a);
		flag=0;
		
		if(l<10){
			printf("-1/n");
			continue;
		}
		
		if((m=strstr(a,b))!=NULL){
			printf("%d %d\n",m-a+3,m-a+4);
			continue;
		}
		
		for(i=0;i<=l-10;i++){
			memset(c,0,sizeof(c));
			k=0;
			same=10;
			
			for(j=0;j<10;j++){
				if(a[i+j]!=b[j]){
					d[k++]=j;
					same--;
					if(same<8) break;
				}	
			}
						
			if(same>7) {
				strncpy(c,a+i,10);
				if(same==8){
					temp=c[d[0]];
					c[d[0]]=c[d[1]];
					c[d[1]]=temp;
					if(strcmp(c,b)==0){
						flag=1;
						x=i+d[0]+1;
						y=i+d[1]+1;
						break;
					}
					else continue;
				}
				else{
					for(k=0;k<l;k++){
						if(k>=i&&k<i+10) continue;
						if(a[k]==b[d[0]]){
							flag=1;
							x=k+1;
							y=i+d[0]+1;
							break;
						}
					}
				}
			}
		}
		
		if(flag==1)	printf("%d %d\n",x,y);
		else	printf("-1\n");
		
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值