题目
较优算法
第一种
思路
遍历单词str1,与str2比较,每找到一个不同的跳过str2的一个字母,找到两个以上不同的字母直接结束;否则继续判断有几个连续相同字母,count计数
代码
#include<string.h>
#define max 1000000
char str1[max+3],str2[max+3];
int count_word[max+3];
int main()
{
int count=1;
char word;
int sign;
fgets(str1, sizeof(str1), stdin);
fgets(str2, sizeof(str2), stdin);
int flag = 1;
int len = strlen(str1);
for(int i=0,j=0;i<len;i++,j++)//一个一个遍历,找不同字母
{
if(str1[i]!=str2[j])/////henan a
{ /////hennan n
j++;
word=str2[j-1];
sign = j-1;
}
if(j-i>1)
{
flag=0;
break;
}
}
if(flag)
{
char *p=&str2[sign];
while(p-1>=str2&&word==*(p-1))
{
count++;
p--;
}
printf("%d\n",count);
int j=0;
while(count-j)
{
printf("%d %c\n",sign-(count-j)+1,word);
j++;
}
}
else
{
printf("0");
}
return 0;
}
第二种
思路
与第一种思路唯一的变化是当遇到不一样字母时将str2该字母以后前移,再与str1比较,不相同直接结束,相同继续第一种的步骤
代码
#include<string.h>
#define max 1000000
typedef struct POS
{
int p;
char zimu;
}pos;
pos put[max-100];
char str1[max-100],str2[max-100];
int count_word[max-100];
int main()
{
int count=1;
char word;
fgets(str1, sizeof(str1), stdin);
fgets(str2, sizeof(str2), stdin);
int flag = 1;
int len = strlen(str1);
for(int i=0;i<len;i++)//一个一个遍历,找不同字母
{
char word;
if(str1[i]!=str2[i])/////henan a
{ /////hennan n
word=str2[i];
for(int j=i+1;j<=len;j++)//平移一位
{
str2[j-1]=str2[j];
}
str2[strlen(str2)-1]='\0';
if(strcmp(str2,str1)!=0)
{
flag=0;
break;
}
else
{
char *p=&str2[i];
while(p-1>=str2&&word==*(p-1))
{
count++;
p--;
}
int j=0;
while(count-j)
{
put[j].p=i-(count-j)+1;
put[j].zimu=word;
j++;
}
}
break;
}
}
if(flag==0)
{
printf("0\n");
}
else
{
printf("%d\n",count);
for(int i=0;i<count;i++)
{
printf("%d %c\n",put[i].p,put[i].zimu);
}
}
}
启示
写这题的启示:
1. 写代码前先思考优化代码,不要直接暴力算法
2. strlen不要放在循环条件里,(包括判断条件)