算法竞赛入门经典UVA508 Morse Mismatches(JAVA版)

题目:输入每个字母的 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;
    }
}

---就是需要解密的摩斯码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值