UVA 508 java

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
	static String s;
	static String[] a=new String[100010];//单词字典
	static Map<Character, String > q=new TreeMap<Character, String>();
	static Map<String, String > p=new TreeMap<String, String>();
	static char ch;
	static int tot,len,t,r;
	static boolean flag;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		tot=0;
		while(true) {
			ch=sc.next().toCharArray()[0];
			if(ch=='*')break;
			s=sc.next();
			q.put(ch, s);
		}
		while(true) {
			s=sc.next();
			if(s.charAt(0)=='*')break;
			a[++tot]=s;
			len=s.length();
			String ss="";
			for (int i = 0; i < len; i++) {
				ss+=q.get(s.charAt(i));
			}
			p.put(s, ss);
		}
		while(true) {
			s=sc.next();
			if(s.charAt(0)=='*')break;
			len=s.length();
			flag=false;//flag=true表示为精确查找
			r=0;//模糊查找,匹配字典中的位置
			t=80;//长度不相等的两个,长度值差
			for (int i = 1; i <=tot; i++) {
				if(p.get(a[i]).equals(s)) {//精确匹配
					if(!flag) {//flag=false第一个匹配的
						System.out.print(a[i]);
						flag=true;
					}else {//还有其他精确匹配
						System.out.print("!");
						break;
					}
				}else {
					int l=p.get(a[i]).length();//字典中第i个单词的长度
					boolean f=true;
					if(l!=len && Math.abs(l-len)<t) {//长度不等
						for (int j = 0; j < Math.min(l, len); j++) {
							if(p.get(a[i]).charAt(j)!=s.charAt(j)) f=false;
						}
						if(f) {//最短部分匹配
							r=i;
							t=Math.abs(l-len);
						}
					}
				}
			}
			if(!flag) {
				System.out.print(a[r]+"?");
			}
			System.out.println();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值