问题描述
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;
}