字符串暴力

学姐思路非常清下,膜拜orz…orz
POJ 1035
大致题意:
输入一部字典,输入若干单词
1、 若某个单词能在字典中找到,则输出corret
2、 若某个单词能通过 变换 或 删除 或 添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据 输入的那部字典的字典序
3、 若某个单词无论操作与否都无法在字典中找得到,则输出空

暴力吧!模拟吧!
基本思路就是逐个比较 待查单词 与 字典单词 的长度,当且仅当两者长度之差的绝对值<=1时才进行检查操作。

//Memory Time   
//456K  157MS   

#include<iostream>  
#include<string.h>  
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<DictNum;n++)  
        DictLen[n]=strlen(dict[n]);  

    for(int i=0;i<WordNum;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<DictNum;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;  
            }  
        }  

        /*Output*/  

        if(flag)  
            cout<<word[i]<<" is correct"<<endl;  
        else  
        {  
            cout<<word[i]<<": ";  
            for(int j=0;j<pa;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;  
}  

2014.9.27
自己又打了一遍代码,有一处需要注意,即输入处理
#include<cstdio>
#include<cstring>
#define N 10000+10
#include<iostream>
using namespace std;
int dictlen[N];
char dict[N][17],word[51][17];
bool change(char *word,char *dict)
{
    int dif=0;
    while(*word)
    {
        if(*(word++)!=*(dict++))
        {
            dif++;if(dif>1) return false;
        }
    }
    return true;
}
bool del(char *word,char *dict)
{
    int dif=0;
    while(*word)
    {
        if(*word!=*dict)
        {
            word++;dif++;
            if(dif>1) return false;
        }
        else
        {
            word++,dict++;
        }
    }
    return true;
}
bool add(char *word,char *dict)
{
    int dif=0;
    while(*dict)
    {
        if(*word!=*dict)
        {
            dict++;dif++;if(dif>1) return false;
        }
        else
        {
            word++,dict++;
        }
    }
    return true;
}
int main()
{
    int dictnum=0,wordnum=0;
    while(cin>>dict[dictnum] && dict[dictnum++][0]!='#');    //看input  ,这里要注意哦,输入技巧,下面的就不可以!!!
    while(cin>>word[wordnum] && word[wordnum++][0]!='#');
    //while(scanf("%s",dict[dictnum]))if(dict[dictnum++][0]=='#') break;  //XXXXXX!!!!!!
    //while(scanf("%s",word[wordnum]))if(word[wordnum++][0]!='#') break;
    dictnum--,wordnum--;
    for(int i=0;i<dictnum;i++)
    dictlen[i]=strlen(dict[i]);
    for(int i=0;i<wordnum;i++)
    {
        int* address=new int[dictnum];
        int len=strlen(word[i]);
        bool flag=false;
        int pa=0;
        for(int j=0;j<dictnum;j++)
        {
            if(len==dictlen[j])
            {
                if(!strcmp(word[i],dict[j]))
                {
                    flag=true;break;
                }
                else if(change(word[i],dict[j]))
                address[pa++]=j;
            }
            if(len-dictlen[j]==1)
            {
                if(del(word[i],dict[j]))
                address[pa++]=j;
            }
            if(dictlen[j]-len==1)
            {
                if(add(word[i],dict[j]))
                address[pa++]=j;
            }
        }
        if(flag)
            printf("%s is correct\n",word[i]);
        else
        {
            printf("%s: ",word[i]);
            for(int k=0;k<pa;k++)
            {
                printf("%s ",dict[address[k]]);
            }
            puts("");
        }
        delete address;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值