题意:输入字母和数字的编码,输入词典,输入一段编码,求出对应的单词。

思路:来自https://blog.csdn.net/qq_41163933/article/details/82224703

 import java.util.ArrayList;
import java.util.Scanner;
import javax.management.ImmutableDescriptor;
import javax.xml.bind.SchemaOutputResolver; public class Main {
static char[] wordAndNum=new char[50];//存字母和数字
static ArrayList<String> morse=new ArrayList<>();//存摩斯密码
static ArrayList<String> dictionary=new ArrayList<>();//存词典
static ArrayList<String> wait=new ArrayList<>();//输入的编码,等待解码
static ArrayList<String> dicMorse=new ArrayList<>();//词典的莫斯码
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
for(int i=0;;i++)//存字母数字和其对应的摩斯密码
{
String input=scanner.next();
if(input.charAt(0)=='*')
break;
wordAndNum[i]=input.charAt(0);
morse.add(scanner.next());
} while(scanner.hasNext())//存词典
{
String input=scanner.next();
if(input.charAt(0)=='*')
break;
dictionary.add(input);
} while(scanner.hasNext())//存等待解码的密码
{
String input=scanner.next();
if(input.charAt(0)=='*')
break;
wait.add(input);
} for(int i=0;i<dictionary.size();i++)//把词典里面的单词转为string,存到dicMorse
{
String dicMor=dicCast(dictionary.get(i));
dicMorse.add(dicMor);
} for(int i=0;i<wait.size();i++)
{
System.out.println(solve(wait.get(i)));
}//将摩斯码解密为词组 } private static String solve(String string) {
int jz_n=-1,jz=0; //精准匹配的下标,个数
int mh_n=-1,mh=0,mh_length=999; //模糊匹配的下标,个数,模糊字符长度
int length=string.length();//定义摩斯码的长度
int dicmor_length;//定义词组摩斯码的长度;
int num;//匹配的长度
for(int i=0;i<dicMorse.size();i++)
{//遍历每个词组对应的摩斯码
num=0;
dicmor_length=dicMorse.get(i).length();
for(int j=0;j<length&&j<dicmor_length;j++)
{
if(string.charAt(j)==dicMorse.get(i).charAt(j))
num++;
else
break;
}
if(num==dicmor_length&&length==dicmor_length)//当需要解密的摩斯码和词组中的摩斯码完全相等时,则为精准匹配
{
if(jz_n<1)//第一个精确匹配的就是答案
jz_n=i;
jz++;
}
else if((num==dicmor_length&&length>num)||(num==length&&dicmor_length>num))
{//模糊:前面匹配,但:①本身的长度大于词典的密码长;
//或②词典的密码长度大于本身长度
if(mh_length>Math.abs(dicmor_length-length))
{
mh_length=Math.abs(dicmor_length-length);
mh_n=i;
mh++;
}
}
}
if(jz>0)
{
if(jz>1)
return dictionary.get(jz_n)+"!";
else
return dictionary.get(jz_n);
}
else if(mh>0)
return dictionary.get(mh_n)+"?";
else return dictionary.get(0);
}
static String dicCast(String string)//把词典里面的单词转为string
{
String res="";
for(int i=0;i<string.length();i++)
{
for(int j=0;j<26+10;j++)//<26+10
{
if(string.charAt(i)==wordAndNum[j])
{
res+=morse.get(j);
break;
}
}
}
return res;
} }

UVA 508 Morse Mismatches JAVA的更多相关文章

  1. uva 508 - Morse Mismatches(摩斯码)

    来自https://blog.csdn.net/su_cicada/article/details/80084529 习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC Wo ...

  2. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  3. UVa 508 Morse Mismatches (模糊暴力)

    题意:莫尔斯电码,输入若干个字母的Morse编号,一个字典和若干编码.对于每个编号,判断它可能的是哪个单词, 如果有多个单词精确匹配,输出第一个单词并加一个“!”:如果无法精确匹配,那么在编码尾部增加 ...

  4. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  5. 【习题 4-6 UVA - 508】Morse Mismatches

    [链接] 我是链接,点我呀:) [题意] 给你每个字母对应的摩斯密码. 然后每个单词的莫斯密码由其组成字母的莫斯密码连接而成. 现在给你若干个莫斯密码. 请问你每个莫斯密码对应哪个单词. 如果有多个单 ...

  6. UVa 11059 最大乘积 java 暴力破解

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  7. UVa 1646 (递推 JAVA大数) Edge Case

    题意: 有n个点围成一圈,这n个点的匹配就是没有公共点的边集(这些边只能连接一圈中相邻的两点),求所有匹配的个数. 额,我不会分析..=_=|| 算了几个数,找找规律发现它满足斐波那契数列的递推关系, ...

  8. UVA 1590 IP Networks JAVA

    题意:输入m代表接下来的数据个数,计算接下来输入数据的网络掩码,和最小网络地址. 思路:①子网掩码:先将数据转为二进制,判断从哪一位开始有数据不一样,记下下标index,则子网掩码是index的前面是 ...

  9. UVa 495【大数加法】

    UVa 495 求第n位斐波那契数列,n<=5000. 还是大数问题,这次是大数加法.仿照UVa 623的解法来做.623位数可以一位一位的增,但是这个需要预先给够位数,要是按六位存一个数组元素 ...

随机推荐

  1. 分布式通讯架构RPC简单实现

    什么是RPC: RPC(Remote Procedure Call,远程过程调用),一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源 ...

  2. LeetCode(91):解码方法

    Medium! 题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计 ...

  3. 【python】gevent协程例子

    说在前面:用协程还是多线程需要仔细考量.我在做实验时请求了100w个ip,分别用pool为1000的协程和64个线程来跑,结果是多线程的速度是协程的10倍以上. 一个简单的协程例子 #!/usr/bi ...

  4. Python关于类的实操

    实操一:总结 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性? 2.什么是绑定到类的方法,如何定义,如何调用,给谁用?有什么特性? 3.什么是解除绑定的函数,如何定义,如何调用,给 ...

  5. DOBRI

    问题 : DOBRI 时间限制: 1 Sec  内存限制: 128 MB 题目描述 给出一个包含N个整数的序列A,定义这个序列A的前缀和数组为SUM数组 ,当SUM数组中的第i个元素等于在i前面的三个 ...

  6. Python交换a,b两个数值的三种方式

    # coding:utf-8 a = 1 b = 2 # 第一种方式 # t = a # 临时存放变量值 # a = b # b = t # 第二种方式 # a = a + b # a的值已经不是原始 ...

  7. Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档

    写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档 import java.io.File; import java.io.FileNotFoundException; import ...

  8. js两种写法执行速度比较

    记录 function test1(){ this.say = function(){} } function test2(){ this.say = function(){} return this ...

  9. Android 第一波

    1. Devik进程,Linux进程,线程的区别 说一说对 SP 频繁操作有什么后果? SP 能存储多少数据? SP 的底层其实是由xml文件来实现的,操作 SP 的过程其实就是xml的序列化和反序列 ...

  10. 区分TCP包的顺序

    确认TCP包的顺序: 使用抓包工具抓包之后,通常按照时间先后排序的,而不是数据的内容逻辑先后.查找内容的先后的关键在于查看TCP中的Sequence number和Acknowledgment num ...