题目:输入每个字母的 Morse编码(字母代码表)。对于每个编码,判断它可能是哪个单词。如果有多个单词精确匹配,输出第一个匹配的单词并且后面加上"!";如果 无法精确匹配,可以在编码尾部增加或删除一些字符以后匹配某个单词(增加或删除的字符应尽量少)。如果只能非精确匹配,任选一个可能的匹配单词,后面加上"?"。
思路:输入的理解//第一部分的输入为每个字母或数字对应的摩斯码
*第二部分为给定的词组 也就是用户输入的结果只能为这其中的词组
*第三部分为需要解密的编码// 将给定的词组通过给定字母对应的摩斯码解密 再将需要解密的摩斯码将其进行比较
需要注意两点 精准和模糊的判断
方法:主要是用链表存储
import java.util.*;
/*第一部分的输入为每个字母或数字对应的摩斯码
*第二部分为给定的词组 也就是用户输入的结果只能为这其中的词组
*第三部分为需要解密的编码
*/
public class Main{
static char[] zm=new char[50];//存字母或数字
static ArrayList<String> morce = new ArrayList<String>();;//存摩斯密码
static ArrayList<String> cz = new ArrayList<String>();//存指定词组
static ArrayList<String> cmorce = new ArrayList<String>();//存指定词组的摩斯码
static ArrayList<String> count = new ArrayList<String>();//存需要解密的摩斯码
public static void main(String args[]){
@SuppressWarnings("resource")
Scanner c=new Scanner(System.in);
for(int i=0;;i++){
String a=c.next();
if(a.equals("*")) break;
zm[i]=a.charAt(0);
morce.add(c.next());
}//存摩斯密码
while(c.hasNext()){
String b=c.next();
if(b.equals("*")) break;
cz.add(b);
}//存规定词组
//Collections.sort(cz); 排序
while(c.hasNext()){
String d=c.next();
if(d.equals("*")) break;
count.add(d);
}//存需要解密的摩斯码
for(int i=0;i<cz.size();i++){
String temp=jiemi(cz.get(i));//将转换的摩斯码存在cmorce链表中。
cmorce.add(temp);
}
for(int i=0;i<count.size();i++){
System.out.println(solove(count.get(i)));
}//将摩斯码解密为词组
}
static String solove(String y) {
// TODO Auto-generated method stub
int jz_n=-1,jz=0; //精准匹配的下标,个数
int mh_n=-1,mh=0,mh_length=999; //模糊匹配的下标,个数,模糊字符长度
int length=y.length();//定义摩斯码的长度
int cm_length;//定义词组摩斯码的长度;
int num;
for(int i=0;i<cmorce.size();i++){//遍历每个词组对应的摩斯码
cm_length=cmorce.get(i).length();
num=0;
for(int j=0;j<length&&j<cm_length;j++){
if(y.charAt(j)==cmorce.get(i).charAt(j)){
num++;
}
else break;
}
if(num==cm_length&&length==cm_length){//当需要解密的摩斯码和词组中的摩斯码完全相等时,则为精准匹配
if(jz<1)
jz_n=i;
jz++;
}
else if((num==cm_length&&length>num)||(num==length&&cm_length>num)){//模糊匹配;本身的长度大于词组的摩斯密码长;
//词组的摩斯密码的长度大于本身长度
if(mh_length>Math.abs(cm_length-length)){
mh_length=Math.abs(cm_length-length);
mh_n=i;
mh++;
}
}
}
if(jz>0){
if(jz>1) return cz.get(jz_n)+"!";
return cz.get(jz_n);
}
else if(mh>0){
return cz.get(mh_n)+"?";
}
else return cz.get(0);
}
private static String jiemi(String x) {
//将规定词组转换为摩斯码
String ans="";
for(int i=0;i<x.length();i++){
for(int j=0;j<26+10;j++){
if(x.charAt(i)==zm[j])
{
ans=ans+morce.get(j);
break;
}
}
}
return ans;
}
}
---就是需要解密的摩斯码