Java 将摩尔斯电码转换为英语词典单词
我试图解决一个问题,给定一串莫尔斯电码字符,在字典中找到有意义的单词 比如说 此输入字符串“.-.-.-.-.-.-.-.-”应翻译为“fox lazy”,可能有多个其他翻译,但这是一种可能的解决方案,因为这两个单词在英语词典中都有 我写了两个函数,translateMose和SegmentString。 SegmentString拆分英语字符串并查找字典中所有有意义的单词。例如,如果输入为“foxlazy”,则函数可以查找字典中存在的两个有意义的单词“fox”和“lazy” TranslateMose实际上应该将莫尔斯电码输入“.-.-.-.-.-.-.-”转换为“foxlazy”,以便SegmentString提供结果输出,但棘手的部分是莫尔斯电码的翻译不是直接的,它给了我许多翻译 我如何解决这个问题Java 将摩尔斯电码转换为英语词典单词,java,recursion,morse-code,Java,Recursion,Morse Code,我试图解决一个问题,给定一串莫尔斯电码字符,在字典中找到有意义的单词 比如说 此输入字符串“.-.-.-.-.-.-.-.-”应翻译为“fox lazy”,可能有多个其他翻译,但这是一种可能的解决方案,因为这两个单词在英语词典中都有 我写了两个函数,translateMose和SegmentString。 SegmentString拆分英语字符串并查找字典中所有有意义的单词。例如,如果输入为“foxlazy”,则函数可以查找字典中存在的两个有意义的单词“fox”和“lazy” Translate
import java.util.*;
public class MorseCode {
String TranslateMorse(String input, Map<String, String> morse) {
// "-.-..-.--..--...-....---"
if (morse.containsKey(input))
return morse.get(input);
int len = input.length();
for (int i = 1; i < len; i++) {
String prefix = input.substring(0, i);
if (morse.containsKey(prefix)) {
String suffix = input.substring(i, len);
String segSuffix = SegmentString(suffix, morse);
if (segSuffix != null) {
return morse.get(prefix) + segSuffix;
}
}
}
return null;
}
String SegmentString(String input, Set<String> dict) {
if (dict.contains(input))
return input;
int len = input.length();
for (int i = 1; i < len; i++) {
String prefix = input.substring(0, i);
if (dict.contains(prefix)) {
String suffix = input.substring(i, len);
String segSuffix = SegmentString(suffix, dict);
if (segSuffix != null) {
return prefix + " " + segSuffix;
}
}
}
return null;
}
// Driver method
public static void main(String args[]) {
Map<String, String> morse = new HashMap<>();
morse.put(".-", "a");
morse.put("-...", "b");
morse.put("-.-.", "c");
morse.put("-..", "d");
morse.put(".", "e");
morse.put("..-.", "f");
morse.put("--.-", "g");
morse.put("....", "h");
morse.put("..", "i");
morse.put(".---", "j");
morse.put("-.-", "k");
morse.put(".-..", "l");
morse.put("--", "m");
morse.put("-.", "n");
morse.put("---", "o");
morse.put(".--.", "p");
morse.put("--.-", "q");
morse.put(".-.", "r");
morse.put("...", "s");
morse.put("-", "t");
morse.put("..-", "u");
morse.put("...-", "v");
morse.put(".--", "w");
morse.put("-..-", "x");
morse.put("-.--", "y");
morse.put("--..", "z");
Set<String> dict = new HashSet<>();
dict.add("apple");
dict.add("honey");
dict.add("fox");
dict.add("quick");
dict.add("jumped");
dict.add("bill");
dict.add("jam");
dict.add("holy");
dict.add("mega");
dict.add("lazy");
// fox lazy
String input = "..-.----..-.-...---..-.--";
MorseCode m = new MorseCode();
String alpha = m.TranslateMorse(input, morse);
System.out.println(alpha);
System.out.println(m.SegmentString(alpha, dict));
}
}
import java.util.*;
公共类莫尔斯电码{
字符串翻译记忆(字符串输入,映射莫尔斯){
// "-.-..-.--..--...-....---"
if(莫尔斯·康纳斯基(输入))
返回morse.get(输入);
int len=input.length();
对于(int i=1;i
我假设这个问题的关键是莫尔斯点击流中没有字母、单词、分隔符(空格),这是分析的一部分。我在代码中看到的关键问题是:
- 你假设你会得到一个单一的答案,反映在你对数据类型的选择上,而实际上你会得到多个需要过滤的答案
- 您的
方法在应该递归调用自身时调用TranslateMorse()
SegmentString()
import java.util.*;
public class MorseCode {
List<String> TranslateMorse(String input, Map<String, String> dictionary) {
List<String> strings = new ArrayList<String>();
if (dictionary.containsKey(input)) {
strings.add(dictionary.get(input));
}
int length = input.length();
for (int i = 1; i < length; i++) {
String prefix = input.substring(0, i);
if (dictionary.containsKey(prefix)) {
String suffix = input.substring(i, length);
List<String> translations = TranslateMorse(suffix, dictionary);
if (! translations.isEmpty()) {
String letter = dictionary.get(prefix);
for (String translation : translations) {
strings.add(letter + translation);
}
}
}
}
return strings;
}
List<String> SegmentString(String input, Set<String> wordList) {
List<String> strings = new ArrayList<String>();
if (wordList.contains(input))
strings.add(input);
int length = input.length();
for (int i = 1; i < length; i++) {
String prefix = input.substring(0, i);
if (wordList.contains(prefix)) {
String suffix = input.substring(i, length);
List<String> expansions = SegmentString(suffix, wordList);
if (! expansions.isEmpty()) {
for (String expansion : expansions) {
strings.add(prefix + " " + expansion);
}
}
}
}
return strings;
}
public static void main(String args[]) {
Map<String, String> morse = new HashMap<>();
morse.put(".-", "a");
morse.put("-...", "b");
morse.put("-.-.", "c");
morse.put("-..", "d");
morse.put(".", "e");
morse.put("..-.", "f");
morse.put("--.-", "g");
morse.put("....", "h");
morse.put("..", "i");
morse.put(".---", "j");
morse.put("-.-", "k");
morse.put(".-..", "l");
morse.put("--", "m");
morse.put("-.", "n");
morse.put("---", "o");
morse.put(".--.", "p");
morse.put("--.-", "q");
morse.put(".-.", "r");
morse.put("...", "s");
morse.put("-", "t");
morse.put("..-", "u");
morse.put("...-", "v");
morse.put(".--", "w");
morse.put("-..-", "x");
morse.put("-.--", "y");
morse.put("--..", "z");
Set<String> english = new HashSet<>();
english.add("apple");
english.add("honey");
english.add("fox");
english.add("quick");
english.add("jumped");
english.add("bill");
english.add("jam");
english.add("holy");
english.add("mega");
english.add("lazy");
String input = "..-.----..-.-...---..-.--"; // fox lazy
MorseCode decoder = new MorseCode();
List<String> decodings = decoder.TranslateMorse(input, morse);
for (String decoding : decodings) {
List<String> phrases = decoder.SegmentString(decoding, english);
for (String phrase : phrases) {
System.out.println(input + " -> " + decoding + " -> " + phrase);
}
}
}
}
这不是一个快速的程序——在本例中大约需要10秒钟,因为它必须将DIT和DAH的所有可能解释过滤成莫尔斯电码符号,然后通过英语单词列表过滤这些符号。我假设这个问题的关键是没有字母或单词分隔符(空格)在莫尔斯的点击流中,这是分析的一部分。我在代码中看到的关键问题是:
- 你假设你会得到一个单一的答案,反映在你对数据类型的选择上,而实际上你会得到多个需要过滤的答案
- 您的
方法在应该递归调用自身时调用TranslateMorse()
SegmentString()
import java.util.*;
public class MorseCode {
List<String> TranslateMorse(String input, Map<String, String> dictionary) {
List<String> strings = new ArrayList<String>();
if (dictionary.containsKey(input)) {
strings.add(dictionary.get(input));
}
int length = input.length();
for (int i = 1; i < length; i++) {
String prefix = input.substring(0, i);
if (dictionary.containsKey(prefix)) {
String suffix = input.substring(i, length);
List<String> translations = TranslateMorse(suffix, dictionary);
if (! translations.isEmpty()) {
String letter = dictionary.get(prefix);
for (String translation : translations) {
strings.add(letter + translation);
}
}
}
}
return strings;
}
List<String> SegmentString(String input, Set<String> wordList) {
List<String> strings = new ArrayList<String>();
if (wordList.contains(input))
strings.add(input);
int length = input.length();
for (int i = 1; i < length; i++) {
String prefix = input.substring(0, i);
if (wordList.contains(prefix)) {
String suffix = input.substring(i, length);
List<String> expansions = SegmentString(suffix, wordList);
if (! expansions.isEmpty()) {
for (String expansion : expansions) {
strings.add(prefix + " " + expansion);
}
}
}
}
return strings;
}
public static void main(String args[]) {
Map<String, String> morse = new HashMap<>();
morse.put(".-", "a");
morse.put("-...", "b");
morse.put("-.-.", "c");
morse.put("-..", "d");
morse.put(".", "e");
morse.put("..-.", "f");
morse.put("--.-", "g");
morse.put("....", "h");
morse.put("..", "i");
morse.put(".---", "j");
morse.put("-.-", "k");
morse.put(".-..", "l");
morse.put("--", "m");
morse.put("-.", "n");
morse.put("---", "o");
morse.put(".--.", "p");
morse.put("--.-", "q");
morse.put(".-.", "r");
morse.put("...", "s");
morse.put("-", "t");
morse.put("..-", "u");
morse.put("...-", "v");
morse.put(".--", "w");
morse.put("-..-", "x");
morse.put("-.--", "y");
morse.put("--..", "z");
Set<String> english = new HashSet<>();
english.add("apple");
english.add("honey");
english.add("fox");
english.add("quick");
english.add("jumped");
english.add("bill");
english.add("jam");
english.add("holy");
english.add("mega");
english.add("lazy");
String input = "..-.----..-.-...---..-.--"; // fox lazy
MorseCode decoder = new MorseCode();
List<String> decodings = decoder.TranslateMorse(input, morse);
for (String decoding : decodings) {
List<String> phrases = decoder.SegmentString(decoding, english);
for (String phrase : phrases) {
System.out.println(input + " -> " + decoding + " -> " + phrase);
}
}
}
}
这不是一个快速的程序——在本例中大约需要10秒钟,因为它必须将所有可能的DIT和DAH解释过滤成莫尔斯电码符号,然后通过英文单词列表过滤这些符号。非常感谢@cdlane我注意到在Translate Morse中我称为SegmentString的错误,但即使在修正了排列和组合太高的问题后,尤其是没有定界符(这不是理想的情况,即使在现实世界中,莫尔斯电码也总是有一个字符定界符。单词定界符是可选的)。再次感谢更正的代码。就像你提到的,这需要很长时间。我相信函数的复杂度是指数级的。非常感谢@cdlane我注意到了我在c