Surprising Strings
Problem Description
Consider the string ZGBG. Its 0-pairs are ZG, GB, and BG. Since these three pairs are all different, ZGBG is 0-unique. Similarly, the 1-pairs of ZGBG are ZB and GG, and since these two pairs are different, ZGBG is 1-unique. Finally, the only 2-pair of ZGBG is ZG, so ZGBG is 2-unique. Thus ZGBG is surprising. (Note that the fact that ZG is both a 0-pair and a 2-pair of ZGBG is irrelevant, because 0 and 2 are different distances.)
Acknowledgement: This problem is inspired by the "Puzzling Adventures" column in the December 2003 issue of Scientific American.
Input
Output
Sample Input
ZGBG X EE AAB AABA AABB BCBABCC *
Sample Output
ZGBG is surprising. X is surprising. EE is surprising. AAB is surprising. AABA is surprising. AABB is NOT surprising. BCBABCC is NOT surprising.
思路:根据题意可以将给的字符串保存到一个二维数组中,因为都是两个所以数组的列数只有2。首先是字母相邻的,然后是字母间的距离为1,为2....,直到字符串中的第j个与它后面的第i个没相配的了就结束。最后对二维数组进行查找看是否有相等的,如果有,则直接退出,没有则增加i的个数。
#include"stdio.h"
#include"string.h"
int main()
{
int i,j,len,k,z,l,flag;
char ch[100];
char s[100][2];
while(gets(ch))
{
memset(s,0,sizeof(s));
flag=0;
if(ch[0]=='*')
break;
len=strlen(ch);
for(i=1;i<len-1;i++)
{
k=0;
for(j=0;j+i<len;j++) //当第j个字母后面空了i个字母后,就不会出现配对的字母了。停止
{
s[k][0]=ch[j]; //配对的字母保存到一个二维数组中
s[k][1]=ch[j+i];
k++;
}
for(z=0;z<k;z++) //然后对二维数组进行查找看是否有相同的,如果有则退出,没有就将他们之间的字母加一重复比较
for(l=z+1;l<k;l++)
{
if(s[z][0]==s[l][0]&&s[z][1]==s[l][1])
{flag=1;break;}
}
if(flag==1)
break;
}
if(flag==1)
{
printf("%s is NOT surprising.\n",ch);
}
else
{
printf("%s is surprising.\n",ch);
}
memset(ch,0,sizeof(ch));
}
return 0;
}