UVA671 模拟,字符串检查

本文介绍了一种用于检查字符串是否存在于词典中的算法,并详细解析了三种特殊情况的处理方法:字符替换、插入和删除。通过具体实现展示了如何高效地进行字符串匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1题意

先给出一些单词构成词典,然后检查所给字符串,是否字典中的单词,如果是则输出“is correct”,或者检查是否满足下面三个条件之一,如果是,那么按输入顺序,输出字典中所有满足条件的单词:

是词典中某个单词中某个字母被替换成另一个字母而得到

是词典中某个单词增加一个字母而得到

是词典中某个单词减少一个字母而得到

2 分析

1)UVA、POJ同样的题目,UVA好像会增加格式要求啊,注意输出的字典中所有满足条件单词之间、以空格为分割,另外,每个案例中间有一行空白:

while(num--){

...

if(num!=0)   cout<<endl;

}

2)

对于三个条件,后两个条件和第一个条件的判断方法不同(第一个条件注释的部分,就是会WA的部分),因为第一个条件是两个待比较单词是相同元素个数的,所以必须逐一位置比较!!!否则,如 fi  if 本应不符合条件,但是程序会认为符合条件。

3

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;

const int maxn=100010;
struct Node{
    char value[30];
}cidian_sort[maxn];
char cidian[maxn][30];
int cur=0;
char temp[30];
void    Read(){
    strcpy(cidian_sort[cur].value,temp);
    strcpy(cidian[cur++],temp);
}
bool cmp(struct Node a1,struct Node a2){
    //return strcmp(a1.value,a2.value)<0;
    return (strcmp(a1.value,a2.value))<0?true:false;
}
int Find(int l,int r){
    while(l<=r){
        int m=(l+r)>>1;
        int st=strcmp(cidian_sort[m].value,temp);
        if(st==0)
            return m;
        else if(st<0){
            l=m+1;
        }
        else if(st>0){
            r=m-1;
        }
    }
    return 0;
}
void Judge(){
    int len_temp=strlen(temp);
    for(int i=0;i<cur;i++){
        int len=strlen(cidian[i]);
        if(len==len_temp){
            int kk=0;
            for(int j=0;j<len;j++){
                if(kk>=2) break;
                if(cidian[i][j]!=temp[j])
                    kk++;
            }
            if(kk<2){
                cout<<" "<<cidian[i];
            }
            /*
            int temp_id=0;
            int kk=0;
            for(int j=0;j<len;j++){// if  fi
                if(kk>=2)   break;
                if(cidian[i][j]==temp[temp_id]){//fi  if
                    temp_id++;
                }
                else
                    kk++;
            }
            if(temp_id==len_temp-1&&){
                cout<<" "<<cidian[i];
                //if(strcmp(cidian[i],"if")==0){  cout<<" WRONG ";}
                continue;
            }
            */
        }
        else if(len==len_temp+1){
            int temp_id=0;
            int kk=0;
            for(int j=0;j<len;j++){
                if(kk>=2)   break;
                if(cidian[i][j]==temp[temp_id])
                    temp_id++;
                else
                    kk++;
            }
            if(temp_id==len_temp){
                cout<<" "<<cidian[i];
                continue;
            }
        }
        else if(len+1==len_temp){
            int cidian_id=0;
            int kk=0;
            for(int j=0;j<len_temp;j++){
                if(kk>=2)   break;
                if(temp[j]==cidian[i][cidian_id])
                    cidian_id++;
                else
                    kk++;
            }
            if(cidian_id==len){
                cout<<" "<<cidian[i];
                continue;
            }
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int num;
    scanf("%d",&num);
    while(num--){
        cur=0;
        while(scanf("%s",temp)&&temp[0]!='#'){
            Read();
        }
        sort(cidian_sort,cidian_sort+cur,cmp);
        while(scanf("%s",temp)&&temp[0]!='#'){
            if(Find(0,cur-1)!=0)
                cout<<temp<<" is correct"<<endl;
            else{
                cout<<temp<<":";
                Judge();
                cout<<endl;
            }
        }
        if(num!=0)  cout<<endl;//每个案例之间空白一行
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值