POJ1035拼写检查

1035:拼写检查

POJ题目地址:http://www.bailian.openjudge.cn/practice/
最近女友在学Java,实在没题目出给她了,想起POJ,自己以前用C++做过一些,但是好久不用C了,都生疏了,这题今天花了点时间写出来,感觉需要记录一些。话不多说,直接上代码,关键部分我写上注释
package com.cl.poj;

import java.util.ArrayList;
import java.util.List;

public class poj1035 {

	/**
	 * 现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的单词,有的是词典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词A与单词B相似的情况有三种:
		1、删除单词A的一个字母后得到单词B;
		2、用任意一个字母替换单词A的一个字母后得到单词B;
		3、在单词A的任意位置增加一个字母后得到单词B。
		你的任务是发现词典中与给定单词相同或相似的单词。
		
		按照输入的顺序,为每个需要检查的单词输出一行。如果需要检查的单词出现在词典中,
		输出“?x is correct",?x代表需要检查的单词。如果需要检查的单词没有出现在词典中,
		则输出"?x: ?x1 ?x2 ...?xn",其中?x代表需要检查的单词,?x1...?xn代表词典中与
		需要检查的单词相似的单词,这些单词中间以空格隔开。如果没有相似的单词,输出"?x:"即可。
		
		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
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] src = {"i","is","has","have","be","my","more","contest","me","too","if","award"};
		String[] str = {"me","aware","m","contest","hav","oo","or","i","fi","mre"};
		List<String> list = new ArrayList<String>();//接收相似的单词
		for(int i = 0; i <str.length; i++){
			list.clear();//清空
			int distance = 0;
			for(int j = 0; j < src.length; j++){
				//长度之差只能是 -1,0,1
				distance = getDistance(src[j],str[i]);
				if(distance == 0){
					//字典里对的只有一个
					//跳出里面的循环
					break;					
				}
				if(distance == 1){
					//相似的
					list.add(src[j]);
				}
			}
			if(distance == 0){
				System.out.print(str[i]+" is correct");
			}else if(list.size() == 0){
				//需要检查的单词没有出现在词典中
				System.out.print(str[i]+":");
			}else{
				System.out.print(str[i]+": ");
				for(int j = 0;j<list.size();j++){
					System.out.print(list.get(j)+" ");
				}
			}
			System.out.println();
		}
		//System.out.println('c'=='a');
	}
	/**
	 * @return 0:相同  , 1:相似,2:不同
	 * */
	private static int getDistance(String A, String B) {
		int distance = 0;
		int i=0;
		//判断长度之差大于1的,即无需判断的
		if(A.length()-B.length()>1 || B.length()-A.length()>1){
			distance = 2;
			return distance;
		}
		//1、删除单词A的一个字母后得到单词B;
		if(A.length()-B.length() == 1){
			int j=0;
			int count = 0;//标记A是否循环到与B不相等
			for(i=0;i<B.length();i++){
				//判断是否下标要变化
				/*A: asdfg    B:asfg
					i =0 ,i=1都没问题,但是i=2时不一样
					执行count++,表示有一位不同,然后i--变为1;
					注意此时A和B的下标变化,B为i,A为i+1;在for循环会执行i++;此时i=2
					即把B 2位置与 A 3位置比较。
					i--目的就是把程序在遇到不同时会逃过该字符而判断接下来的
					保证所有字符都会被判断
				总结:遇到不一样的字符,B的下标不变,A的下标+1,重新判断是否相同
				*/
				if(count == 0){
					j=i;
				}else if(count == 1){
					j=i+1;
				}else if(count > 1){
					break;
				}
				if(A.charAt(j) == B.charAt(i)){					
				}
				else{
					//进来就表示有一位不相等,
					count++;
					//判断A的index加1,后与B是否一样
					//这里:肯定是count==1时,有j=i+1;i--的目的是A把不同的去掉后重新与B比较
					i--;
				}					
			}
			//count == 1 是中间有一个不一样,i == B.length()是最后一个不一样
			if(count == 1 || i == B.length()){
				distance = 1;
			}else{
				distance = 2;
			}
			return distance;
		}
		
		//2、用任意一个字母替换单词A的一个字母后得到单词B;
		if(A.length() == B.length()){
			int count = 0;
			for(i=0;i<B.length();i++){				
				if(A.charAt(i) == B.charAt(i)){					
				}
				else{
					//进来就表示有一位不相等,A的index加1,
					count++;				
				}					
			}
			if(count==0){//单词相同的
				distance = 0;
			}else if(count == 1){
				distance = 1;
			}else{
				distance = 2;
			}
			return distance;
		}
		
		//3.在单词A的任意位置增加一个字母后得到单词B。
		//与第一种情况类似
		if(B.length()-A.length() == 1){
			int j=0;
			int count = 0;//标记A是否循环到与B不相等
			for(i=0;i<A.length();i++){
				if(count == 0){
					j=i;
				}else if(count == 1){
					j=i+1;
				}else if(count > 1){
					break;
				}
				if(A.charAt(i) == B.charAt(j)){					
				}
				else{
					//进来就表示有一位不相等,A的index加1,
					count++;
					i--;
				}					
			}
			if(i==A.length() || count == 1 ){
				distance = 1;
			}else{
				distance = 2;
			}
			return distance;
		}
		
		return distance;
		
	}

}


你可能感兴趣的:(java,poj)