使用字典树和Hashtable两种方法解POJ 2503(JAVA)

poj2503题意:
 给出一个最多有100000对单词的英语和外语的字典,然后给你一个外语单词 要求你查字典翻译成英语,如果词典里查不到就输出eh。
样例:

Sample Input

dog ogday
cat atcay
pig igpay
froot ootfray
loops oopslay

atcay
ittenkay
oopslay


Sample Output

cat
eh
loops


解法一:使用jdk中的Hashtable(或HashMap)

import java.util.Scanner;
import java.util.Hashtable;

public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Hashtable< String,String> table = new Hashtable< String, String>();
String input;
String [] array=new String[2];
while(in.hasNext()){
input=in.nextLine();
if(input.length()==0)break;
array=input.split(" ");
table.put(array[1],array[0]);
}
while(in.hasNext()){
input=in.nextLine();
if(table.get(input)!=null) System.out.println(table.get(input));
else System.out.println("eh");
}
}
}



方法二:使用字典树
思路:用所有的外语单词去建一棵字典树,然后向这棵字典树中查找给出的单词
import java.util.Scanner;
import java.text.DecimalFormat;

class Trie{ //字典树
Trie next[] = new Trie[26];//所有儿子节点
String enWord;// 用于记录对应的英语单词
public Trie(){
enWord=null;
}
}

public class Main{
Trie root = new Trie();

void solve() {
Scanner in = new Scanner(System.in);
String input;
String [] array=new String[2];
while(in.hasNext()){//用所有外文字符串,构造字典树
input = in.nextLine();
if(input.length()==0) break;
array=input.split(" ");
insert(array[1],array[0]);
}
while(in.hasNext()){
input=in.nextLine();
System.out.println(search(input));
}
}

//建立字典树
public void insert(String str,String enWord) { //将一个外文字符串插入字典树
if (str == null || str.length() == 0) {
return ;
}
Trie node = root;
char[] letters=str.toCharArray();
for (int i = 0; i < str.length(); i++) {
int pos = letters[i] - 'a';
if (node.next[pos] == null) {
node.next[pos] = new Trie();
//node.son[pos].val = letters[i];
}
node = node.next[pos];
}
//外文字符串的最后一个节点,根节点到此节点构成了一个外文单词,此单词对应的英文单词为enWord;
node.enWord = enWord;
}


// 在字典树中查找一个完全匹配的外文单词,返回其对应的英文单词.
public String search(String str) {
if (str == null || str.length() == 0) {
return null;
}
Trie node = root;
char[] letters=str.toCharArray();
for (int i = 0, len = str.length(); i < len; i++) {
int pos = letters[i] - 'a';
if (node.next[pos] != null) {
node = node.next[pos];
} else {
return "eh";
}
}
return node.enWord;
}


public static void main(String[] args) {
Main test = new Main();
test.solve();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值