A1027. 拼写检查

问题描述

  微软的Word有一个拼写检查功能,如果你拼写错了单词,它会用红线标出以示提醒,然后给出可能正确的单词。现在要你编程实现类似的一个系统:给定一个词表以及一个待检查的单词,判断这个单词是否在词表中,如果不在词表中,程序应该给出一个相似的单词。
  在寻找相似的单词时,你只需要考虑如下几个简单的情况:
  1、漏写了一个字母,如把abacus误拼写为abacs
  2、多写了一个字母,如把abacus误拼写为abaacus
  3、将某处的一个字母写成了另一个字母,如abacus误拼写为abacup
  编程实现这个系统。
输入格式
  输入数据的第一行是一个由小写字母组成的字符串,表示要进行拼写检查的单词
  第二行是一个数N(1<=N<=100),表示词表中词的数目
  接下来有N行,每行都是一个由小写字母组成的字符串,代表词表中的每一个单词
  所有字符串的长度在2到20之间
输出格式
  仅输出一个字符串:
  1、如果要检查的单词在词表中出现,则原样输出该单词
  2、如果要检查的单词在词表中未出现,但在词表中找到相似的单词,则输出在词表中和它相似的那个单词。如果在此表中找到多个相似单词,仅输出在输入文件中最靠前的一个。
  3、如果要检查的单词在词表中未出现,并且在词表中找不到与它相似的单词,输出NOANSWER
样例输入
abstaine
4
abacus
abstract
abstain
abstainer
样例输出
abstain
package www.tsinsen.com;

import java.util.Scanner;

public class A1027 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        String str=scan.next();
        int n=scan.nextInt();
        int flag=0;
        String[] strs=new String[n];
        for(int i=0;i<n;i++) {
            strs[i]=scan.next();
            
        }
        for(int i=0;i<n;i++) {
            if(str.equals(strs[i])) {
                flag=1;
                System.out.println(str);
            }
        }
        if(flag==0) {
            int index=find(str,strs);
            if(index==-1) {
                System.out.println("NOANSWER");
            }
            else {
                System.out.println(strs[index]);
            }
        }
    }
    public static int find(String str,String[] strs) {
        for(int i=0;i<strs.length;i++) {
            //误写情况,只有一个字符不同
            if(str.length()==strs[i].length()) {
                int count=0;//记录字符不同的个数
                for(int j=0;j<str.length();j++) {
                    if(str.charAt(j)!=strs[i].charAt(j)) {
                        count++;
                    }
                    if(count>1) {
                        break;
                    }
                }
                if(count==1) {
                    return i;
                }
            }
            //str比strs[i]少一个字母情况
            else if(str.length()+1==strs[i].length()) {
                int j;
                for(j=0;j<str.length();j++) {
                    if(str.charAt(j)!=strs[i].charAt(j)) {
                        if(str.substring(j).equals(strs[i].substring(j+1))) {
                            return i;
                        }
                        else {
                            break;
                        }
                    }
                    
                }
                //最后一个字符多余
                if(strs[i].substring(j).length()==1) {
                    return i;
                }
            }
            //str比strs[i]多一个字母情况
            else if(str.length()-1==strs[i].length()) {
                int j;
                for(j=0;j<strs[i].length();j++) {
                    if(str.charAt(j)!=strs[i].charAt(j)) {
                        if(strs[i].substring(j).equals(str.substring(j+1))) {
                            return i;
                        }
                        else {
                            break;
                        }
                    }
                }
                //最后一个字符多余
                if(str.substring(j).length()==1) {
                    return i;
                }
            }
        }
        return -1;
    }

}

 

转载于:https://www.cnblogs.com/henuLiGang/p/8418259.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值