10. 肥宅快乐串

问题描述

Description

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

Input

输入共有 T+1行,T表示需要你进行操作的字符串个数;

第一行一个正整数T;

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

Output

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

思路

思路:遍历数组,每十个与fatyhappy对比。有以下情况:

1、完全一样:则交换两个t即可

2、一个不一样:在这十个之外寻找可替换的

3、两个不一样:若相互交换后仍不符合题意,则-1

4、三个及以上不一样:直接-1

注意:什么时候跳出循环很重要!!!!如:fassyhappyfattyhappy

代码

#include<stdio.h>
#include<string.h>
#include<math.h>
char arr[1100][1100]={0}; 
int main()
{
	int t=0; int m=0; char ch;
	scanf("%d",&t);  ch=getchar();
	char biao[]="fattyhappy\0";
	while(t--)//每一个用例 
	{	int biaos[11]={0};
		gets(arr[m]); int wrong=0;int i=0;
		for(;(arr[m][i])!='\0';i++)
		{;
		}if(i<10) 
		{
			printf("-1\n");goto tt;
		}
		for(int i=0;(arr[m][i])!='\0';i++)//遍历 
		{ 	wrong=0;
			for(int j=i,n=0;n<10;j++,n++)
			{	
				if(arr[m][j]!=biao[n]) 
				{
					wrong++; biaos[n]=1;
				}
				else biaos[n]=0;
			}
			if(wrong>3) continue;
			else if(wrong==0)
			{
				printf("%d %d\n",i+3,i+4);goto tt;
			}
			else if(wrong==1)
			{	int wei=0; 
				for(int fl=0;fl<10;fl++)//找到不一样的字母 
				{
					if(biaos[fl]==1) 
					{
						wei=fl; break;
					}
				}int j=0;
				for(;arr[m][j]!='\0';j++) 
				{
				if(j>=i&&j<=i+9) continue;
				else
				{
					if(arr[m][j]==biao[wei]) 	break;	
				}
				}
				if((arr[m][j])=='\0')
					{
						printf("-1\n"); goto tt;
					}
				j++; int mm=i+wei+1; int min,max;
				j>mm?(min=mm,max=j):(min=j,max=mm);
				printf("%d %d\n",min,max)	;goto tt;				
			}
			else if(wrong==2)
			{	int ad[3]={0};
				for(int y=0,z=0;y<10;y++)
				{
					if (biaos[y]==1)
					{
						ad[z]=y+1;z++;
					}
				}
				int xia1=ad[0]+i-1; int xia2=ad[1]+i-1; 
				int xiab1=ad[0]-1;  int xiab2=ad[1]-1;
				if((arr[m][xia1]==biao[xiab2])&&(arr[m][xia2]==biao[xiab1]))
				{
					printf("%d %d\n",xia1+1,xia2+1);goto tt;
				}
				else
				{	
					continue;
				}
			}
		}
		if(arr[m][i]=='\0'&&i>=10)
		{
			printf("-1\n");
		}
tt:		m++;
	}
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值