Я пытаюсь решить проблему, связанную с тем, что по строке символов азбуки Морзе найти значимые слова в словаре
Например
Эта входная строка "..-. ---- ..-.-... --- ..-.--" должна переводиться как "fox lazy", возможны несколько других переводов, но это одно из возможных решений, поскольку эти два слова присутствуют в словаре английского языка.
Я написал 2 функции, TranslateMorse и SegmentString.
SegmentString разбивает английскую строку и находит все значимые слова в словаре. Например, если input «foxlazy», функция может найти «fox» и «lazy» - это два значащих слова, присутствующих в словаре.
TranslateMorse должен фактически преобразовать ввод кода Морзе "..-. ---- ..-.-... --- ..-.--" в "foxlazy", чтобы SegmentString выдавал результирующий вывод , но сложная часть заключается в том, что перевод MorseCode не является простым и дает мне много переводов.
Как мне решить эту проблему?
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));
}
}