poj 1035

对字符串进行匹配。

按题目要求,可以进行四种形式的匹配。

       1.不动原串。

       2给原串增加一个letter。

      3替换原串中的一个letter。

      4删除原串中的一个letter。



import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
	
	static ArrayList<Item> dicts = new ArrayList<Item>();
	public static void main(String[] args)throws Exception{
		readFile();
	}
	public static void readFile()throws Exception{ //读取数据
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in));
		String temp = null;
		int iCount = 1;
		while(!(temp = br.readLine()).equals("#")){
			dicts.add(new Item(iCount++, temp)); //给字典编号了,并且字典还实现了序列化的接口
		}
//		for(Item it:dicts){
//			System.out.println(it.index+" "+it.str);
//		}
		int flag = 0;
		while(!(temp = br.readLine()).equals("#")){//每读入一个数据,对它进行操作
			if(flag!=0){
				System.out.println();
			}
			process(temp);  //读这些数据进行操作
			flag++;
		}
	}
	public static void process(String str){
		ArrayList<Item> result = new ArrayList<Item>();
		ArrayList<Item> temp = null;
		if(isHava(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); //实现序列化接口,为了是把符合要求的元素按给定的字典序输出
//		for(Item it:result){
//			System.out.println(it.index+"  "+it.str);
//		}
		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++;
		}
	}
	public 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;
	}
	public 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;
	}
	public static boolean isHava(String str){
		for(Item it:dicts){
			if(it.str.equals(str)){
				return true;
			}
		}
		return false;
	}
	public 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;
	}
	public 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;
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值