pku 1035 Spell checker 字符串处理
http://poj.org/problem?id=1035
开始自己把它想成了一个模拟题,就是模拟整个过程,纯暴力,不过把输入的字符串按长度排序,记录每个长度的起点终点,然后在长度范围内查找,输出时注意不能出线重复,以及按在输入序列中的出现顺序输出,所以要编号,输出时,按编号排序输出,对编号进行hash映射,判重,可是就是TLE那整的我叫个郁闷啊。。。
下面这个方法很简洁明了,自己还是思维不够完善,没考虑好。
View Code
#include <cstdio>
#include <cstring>
#define maxn 10007
using namespace std;
char str[maxn][20];
int len;
bool isok(char *a,char *b)
{
int lena = strlen(a);
int lenb = strlen(b);
int i = 0;
if (lena == lenb - 1)//删除一个字符a短长
{
i = 0;
//先找出第一个不同的
while (i < lena && a[i] == b[i])
i++;
i++;
//后面如果还有不同的就不满足条件
while (i < lenb)
{
if (a[i - 1] != b[i])
return false;
i++;
}
}
//替换,同上
else if (lena == lenb)
{
i = 0;
while (i < lena && a[i] == b[i])
i++;
i++;
while (i < lena)
{
if (a[i] != b[i])
return false;
i++;
}
}
//添加,同上
else if (lena == lenb + 1)
{
i = 0;
while (i < lenb && a[i] == b[i])
i++;
i++;
while (i < lena)
{
if (a[i] != b[i - 1])
return false;
i++;
}
}
else return false;
return true;
}
int main()
{
//freopen("d.txt","r",stdin);
int i;
int len = 0;
char ch[20];
while (scanf("%s",str[len]) != EOF)
{
if (!strcmp(str[len],"#")) break;
len++;
}
while (scanf("%s",ch) != EOF)
{
if (!strcmp(ch,"#")) break;
bool flag = false;
//字典序列中存在
for (i = 0; i < len; ++i)
{
if (!strcmp(ch,str[i]))
{
flag = true;
break;
}
}
if (flag)
printf("%s is correct\n",ch);
else
{
printf("%s:",ch);
for (i = 0; i < len; ++i)
{
if (isok(str[i],ch))
printf(" %s",str[i]);
}
printf("\n");
}
}
return 0;
}