首页 > 专题系列 > Java解POJ > POJ 1035 Spell checker [解题报告] Java
2013
11-08

POJ 1035 Spell checker [解题报告] Java

Spell checker

问题描述 :

You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their forms.

If the word is absent in the dictionary then it can be replaced by correct words (from the dictionary) that can be obtained by one of the following operations:

?deleting of one letter from the word;

?replacing of one letter in the word with an arbitrary letter;

?inserting of one arbitrary letter into the word.

Your task is to write the program that will find all possible replacements from the dictionary for every given word.

输入:

The first part of the input file contains all words from the dictionary. Each word occupies its own line. This part is finished by the single character ‘#’ on a separate line. All words are different. There will be at most 10000 words in the dictionary.

The next part of the file contains all words that are to be checked. Each word occupies its own line. This part is also finished by the single character ‘#’ on a separate line. There will be at most 50 words that are to be checked.

All words in the input file (words from the dictionary and words to be checked) consist only of small alphabetic characters and each one contains 15 characters at most.

输出:

Write to the output file exactly one line for every checked word in the order of their appearance in the second part of the input file. If the word is correct (i.e. it exists in the dictionary) write the message: “ is correct”. If the word is not correct then write this word first, then write the character ‘:’ (colon), and after a single space write all its possible replacements, separated by spaces. The replacements should be written in the order of their appearance in the dictionary (in the first part of the input file). If there are no replacements for this word then the line feed should immediately follow the colon.

样例输入:

i
is
has
have
be
my
more
contest
me
too
if
award
#
me
aware
m
contest
hav
oo
or
i
fi
mre
#

样例输出:

me is correct
aware: award
m: i my me
contest is correct
hav: has have
oo: too
or:
i is correct
fi: i
mre: more me

解题代码:

//* @author 
import java.io.*; 
import java.util.*; 

public class Main 
{ 
    static ArrayList< Item> dicts = new ArrayList< Item>(); 

    public static void main(String[] args) throws Exception 
    { 
        readFile(); 
    } 

    static void readFile() throws Exception 
    { 
        BufferedReader br = new BufferedReader( 
            //new FileReader("in.in")); 
            new InputStreamReader(System.in)); 
        StringTokenizer st = null; 
        String temp = null; 
        int iCount = 1; 
        while(!(temp=br.readLine()).equals("#")) 
            dicts.add(new Item(iCount++,temp)); 
        int flag = 0; 
        while(!(temp=br.readLine()).equals("#")) 
        { 
            if(flag!=0) 
                System.out.println(); 
            process(temp); 
            flag++; 
        } 
    } 

    static void process(String str) 
    { 
        ArrayList< Item> result = new ArrayList< Item>(); 
        ArrayList< Item> temp = null; 
        if(isHave(str)) 
        { 
            System.out.print(str+" is correct"); 
            return; 
        } 
        temp = getArrayList(str.length()+1); 
        for(Item it : temp) 
            if(judge(str,it.str)) 
                result.add(it); 
        temp = getArrayList(str.length()-1); 
        for(Item it : temp) 
            if(judge(str,it.str)) 
                result.add(it); 

        temp = getArrayList(str.length()); 
        for(Item it : temp) 
            if(judge1(str,it.str)) 
                result.add(it); 

        Collections.sort(result); 
        System.out.print(str+":"); 
        if(result.size()!=0) 
            System.out.print(" "); 
        int flag = 0; 
        for(Item it : result) 
        { 
            if(flag!=0) 
                System.out.print(" "); 
            System.out.print(it.str); 
            flag++; 
        } 
    } 

    static boolean judge1(String src,String dest) 
    { 
        int i = 0; 
        int count = 0; 
        while(i< src.length()) 
        { 
            if(src.charAt(i)!=dest.charAt(i)) 
            { 
                count++; 
            } 
            if(count>1) 
                return false; 
            i++; 
        } 
        return true; 
    } 

    static boolean judge(String src,String dest) 
    { 
        String min = dest; 
        String max = src; 
        if(src.length()< dest.length()) 
        { 
            min = src; 
            max = dest; 
        } 
        int count = 0; 
        int i = 0; 
        int j = 0; 
        while(i< max.length()&&j< min.length()) 
        { 
            if(max.charAt(i)!=min.charAt(j)) 
            { 
                count++; 
                i++; 
            } 
            else 
            { 
                i++; 
                j++; 
            } 
            if(count>1) 
                return false; 
        } 
        return true; 
    } 

    static boolean isHave(String str) 
    { 
        for(Item it : dicts) 
        { 
            if(it.str.equals(str)) 
                return true; 
        } 
        return false; 
    } 

    static ArrayList< Item> getArrayList(int n) 
    { 
        ArrayList< Item> result = new ArrayList< Item>(); 
        for(Item it : dicts) 
        { 
            if(it.str.length()==n) 
                result.add(it); 
        } 
        return result; 
    } 

    static void display() 
    { 
    } 

    static class Item implements Comparable< Item> 
    { 
        int index; 
        String str; 
        Item(int i,String s) 
        { 
            index = i; 
            str = s; 
        } 
        public int compareTo(Item it) 
        { 
            if(index>it.index) 
                return 1; 
            else if(index< it.index) 
                return -1; 
            else  
                return 0; 
        } 
    } 
}

  1. simple, however efficient. A lot of instances it is difficult to get that a??perfect balancea?? among usability and appearance. I must say that youa??ve done a exceptional task with this. Also, the blog masses quite fast for me on Web explore.