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;
}



转载于:https://www.cnblogs.com/E-star/archive/2012/03/21/2410449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值