poj 1035
2013-12-14 20:01
351 查看
这是一个简单的字符串查找和判断问题:
题目的大意是:
输入一部字典,输入若干单词
1、 若某个单词能在字典中找到,则输出corret
2、
若某个单词能通过 交换一个字符 或
删除 或
添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据
输入的那部字典的字典序
3、 若某个单词无论操作与否都无法在字典中找得到,则输出空。
这个题目的关键在于理解:若某个单词能通过交换、删除、添加一个字符,而变成字典中的某个单词,那么这个单词和字典中的那个肯定只相差一个字符。
下面是我的代码:
//Memory Time
//456K 157MS
#include
#include
using namespace std;
char dict[10001][16];
char word[51][16];
int DictNum=0; //字典计数器
int WordNum=0; //单词计数器
void Input(void);
bool Change(char* word,char* dict);
//检查字符串word能否通过变换得到dict
bool Del(char* word,char* dict);
//检查字符串word能否通过删除得到dict
bool Add(char* word,char* dict);
//检查字符串word能否通过添加得到dict
int main(void)
{
Input();
int* DictLen=new
int[DictNum]; //记计算字典中各个单词的长度
for(int n=0;n
DictLen
=strlen(dict
);
for(int i=0;i
{
int* address=new
int[DictNum]; //记录word[i]通过变化得到的单词在dict中的下标
int pa=0; //address指针
bool
flag=false; //标记字典中是否含有单词word[i]
int len=strlen(word[i]);
for(int k=0;k
{
if(DictLen[k]==len)
//Change or Equal
{
if(!strcmp(word[i],dict[k]))
{
flag=true;
break;
}
else
if(Change(word[i],dict[k]))
address[pa++]=k;
}
else
if(len-DictLen[k]==1) //Delete
{
if(Del(word[i],dict[k]))
address[pa++]=k;
}
else
if(DictLen[k]-len==1) //Add
{
if(Add(word[i],dict[k]))
address[pa++]=k;
}
}
if(flag)
cout<<word[i]<<"
is correct"<<endl;
else
{
cout<<word[i]<<":
";
for(int
j=0;j
cout<<dict[
address[j] ]<<' ';
cout<<endl;
}
delete address;
}
return 0;
}
void Input(void)
{
while(cin>>dict[DictNum] &&
dict[DictNum++][0]!='#');
while(cin>>word[WordNum] &&
word[WordNum++][0]!='#');
DictNum--; //剔除'#'
WordNum--;
return;
}
bool Change(char* word,char* dict)
//WordLen==DictLen
{
int dif=0;
//记录word与dict中在相同位置出现不同字符的个数
while(*word)
{
if(*(word++) !=
*(dict++))
{
dif++;
if(dif>1)
return
false;
}
}
return true;
}
bool Del(char* word,char* dict)
//WordLen==DictLen+1
{
int dif=0;
//记录word与dict中在对应位置出现不同字符的个数
while(*word)
{
if(*word != *dict)
{
word++;
//word后移一位再匹配
dif++;
if(dif>1)
return
false;
}
else
{
word++;
dict++;
}
}
return true;
}
bool Add(char* word,char* dict)
//WordLen==DictLen-1
{
int dif=0;
//记录word与dict中在对应位置出现不同字符的个数
while(*dict)
{
if(*word != *dict)
{
dict++;
//dict后移一位再匹配
dif++;
if(dif>1)
return
false;
}
else
{
word++;
dict++;
}
}
return true;
}
题目的大意是:
输入一部字典,输入若干单词
1、 若某个单词能在字典中找到,则输出corret
2、
若某个单词能通过 交换一个字符 或
删除 或
添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据
输入的那部字典的字典序
3、 若某个单词无论操作与否都无法在字典中找得到,则输出空。
这个题目的关键在于理解:若某个单词能通过交换、删除、添加一个字符,而变成字典中的某个单词,那么这个单词和字典中的那个肯定只相差一个字符。
下面是我的代码:
//Memory Time
//456K 157MS
#include
#include
using namespace std;
char dict[10001][16];
char word[51][16];
int DictNum=0; //字典计数器
int WordNum=0; //单词计数器
void Input(void);
bool Change(char* word,char* dict);
//检查字符串word能否通过变换得到dict
bool Del(char* word,char* dict);
//检查字符串word能否通过删除得到dict
bool Add(char* word,char* dict);
//检查字符串word能否通过添加得到dict
int main(void)
{
Input();
int* DictLen=new
int[DictNum]; //记计算字典中各个单词的长度
for(int n=0;n
DictLen
=strlen(dict
);
for(int i=0;i
{
int* address=new
int[DictNum]; //记录word[i]通过变化得到的单词在dict中的下标
int pa=0; //address指针
bool
flag=false; //标记字典中是否含有单词word[i]
int len=strlen(word[i]);
for(int k=0;k
{
if(DictLen[k]==len)
//Change or Equal
{
if(!strcmp(word[i],dict[k]))
{
flag=true;
break;
}
else
if(Change(word[i],dict[k]))
address[pa++]=k;
}
else
if(len-DictLen[k]==1) //Delete
{
if(Del(word[i],dict[k]))
address[pa++]=k;
}
else
if(DictLen[k]-len==1) //Add
{
if(Add(word[i],dict[k]))
address[pa++]=k;
}
}
if(flag)
cout<<word[i]<<"
is correct"<<endl;
else
{
cout<<word[i]<<":
";
for(int
j=0;j
cout<<dict[
address[j] ]<<' ';
cout<<endl;
}
delete address;
}
return 0;
}
void Input(void)
{
while(cin>>dict[DictNum] &&
dict[DictNum++][0]!='#');
while(cin>>word[WordNum] &&
word[WordNum++][0]!='#');
DictNum--; //剔除'#'
WordNum--;
return;
}
bool Change(char* word,char* dict)
//WordLen==DictLen
{
int dif=0;
//记录word与dict中在相同位置出现不同字符的个数
while(*word)
{
if(*(word++) !=
*(dict++))
{
dif++;
if(dif>1)
return
false;
}
}
return true;
}
bool Del(char* word,char* dict)
//WordLen==DictLen+1
{
int dif=0;
//记录word与dict中在对应位置出现不同字符的个数
while(*word)
{
if(*word != *dict)
{
word++;
//word后移一位再匹配
dif++;
if(dif>1)
return
false;
}
else
{
word++;
dict++;
}
}
return true;
}
bool Add(char* word,char* dict)
//WordLen==DictLen-1
{
int dif=0;
//记录word与dict中在对应位置出现不同字符的个数
while(*dict)
{
if(*word != *dict)
{
dict++;
//dict后移一位再匹配
dif++;
if(dif>1)
return
false;
}
else
{
word++;
dict++;
}
}
return true;
}
相关文章推荐
- poj 2965
- 欢迎您在新浪博客安家
- UnsupportedOperationException
- 黑马程序员—GUI(键盘事件)小例子
- 嵌入式学习之路(十)——C语言学习(5)
- U盘装win7 “安装程序无法创建新的系统分区,也无法定位现有的系统分区“最终解决方法
- 14.java NumberFormat 类
- 给iOS开发新手送点福利,简述UITextField的属性和用法
- 13.java MessageFormat 类
- 黑马程序员—GUI(菜单)小例子
- S3C6410+WinCE+GPIO+流驱动+详细过程
- 项目视频讲解_360问答系统
- Centos yum 错误
- java Math类
- test
- 使用 Spring 2.5 TestContext 测试框架
- 简单的实例来理解WCF 数据服务(WCF DS)
- SendMessage发送组合键
- C# Enum,Int,String之间的互相转换
- java String,StringBuffer,StringBuilder区别及联系