检查给定的摩尔斯电码是否有效
在这个问题中,我们将验证摩尔斯电码。摩尔斯电码方法用于将文本转换为编码格式,在电话发明之前,它对于在两个实体之间进行通信非常有用。
每个字母字符都有标准代码,包含“.”和“−”。代码是根据传输时间制定的,“.”表示短信号,“−”表示长信号。
但是,在本教程中,我们将使用标准化的摩尔斯电码来解码和验证字符串。
以下是标准化摩尔斯电码的表格。
A |
".−" |
H |
"...." |
O |
"−−−" |
V |
"...−" |
B |
"−...", |
I |
".." |
P |
".−−." |
W |
".−−" |
C |
"−.−." |
J |
".−−−" |
Q |
"−−.−" |
X |
"−..−" |
D |
"−.." |
K |
"−.−" |
R |
".−." |
Y |
"−.−−" |
E |
"." |
L |
".−.." |
S |
"..." |
Z |
"−−.." |
F |
"..−." |
M |
"−−" |
T |
"−" |
||
G |
"−−." |
N |
"−." |
U |
"..−" |
问题陈述 - 我们得到一个包含摩尔斯电码的字符串。我们需要检查摩尔斯电码是否有效。
示例
输入
morseCode = "− ..− − −−− .−. .. .−.. ... .−−. −−− .. −. −";
输出
Yes
解释 - 解码字符串后,我们得到“TUTORIALSPOINT”。因此,摩尔斯电码有效。
输入
morseCode = "−− .−.−.−− −−−−−−";
输出
No
解释 - 摩尔斯电码无效。
输入
morseCode = "*− .−.−.−− −−−−−−";
输出
No
解释 - 摩尔斯电码包含“*”字符。因此,它无效。
方法 1
在这种方法中,我们将使用 map 数据结构。我们将每个字母字符的摩尔斯电码存储为 map 中的键,并将字母字符存储为值。
给定的字符串包含每个字符的空格分隔的摩尔斯电码。因此,我们将获取字符串的每个单词,并检查它是否作为 map 中的键存在。如果任何一个单词不存在于 map 中,我们可以说摩尔斯电码无效。
算法
步骤 1 - 初始化包含摩尔斯电码作为键和字符作为值的“codeMap”。
步骤 2 - 初始化“tmp”字符串以存储字符串的当前单词。
步骤 3 - 开始遍历给定字符串的每个字符。
步骤 4 - 如果当前字符是空格,则检查“tmp”字符串值是否作为 map 中的键存在。如果不存在,则返回 false。否则,重新初始化“tmp”字符串。
步骤 5 - 对于“.”和“−”字符,将字符追加到“tmp”字符串。
步骤 6 - 在函数结束时返回 true。
示例
#include <bits/stdc++.h> using namespace std; bool validateMorse(string mCode){ map<string, char> codeMap{ {".-", 'A'}, {"-...", 'B'}, {"-.-.", 'C'}, {"-..", 'D'}, {".", 'E'}, {"..-.", 'F'}, {"--.", 'G'}, {"....", 'H'}, {"..", 'I'}, {".---", 'J'}, {"-.-", 'K'}, {".-..", 'L'}, {"--", 'M'}, {"-.", 'N'}, {"---", 'O'}, {".--.", 'P'}, {"--.-", 'Q'}, {".-.", 'R'}, {"...", 'S'}, {"-", 'T'}, {"..-", 'U'}, {"...-", 'V'}, {".--", 'W'}, {"-..-", 'X'}, {"-.--", 'Y'}, {"--..", 'Z'}, {"-----", '0'}, {".----", '1'}, {"..---", '2'}, {"...--", '3'}, {"....-", '4'}, {".....", '5'}, {"-....", '6'}, {"--...", '7'}, {"---..", '8'}, {"----.", '9'} }; string tmp = ""; for (char ch : mCode) { if (ch == ' ') { // Validate morse code if (codeMap.find(tmp) == codeMap.end()) { return false; } tmp = ""; // Reset tmp string } else { tmp += ch; } } return true; } int main() { string morseCode = "- ..- - --- .-. .. .-.. ... .--. --- .. -. -"; if (validateMorse(morseCode)) { cout << "The Morse code is valid." << endl; } else { cout << "The Morse code is not valid." << endl; } return 0; }
输出
The Morse code is valid.
时间复杂度 - 遍历字符串为 O(N)。
空间复杂度 - O(1),因为我们使用常量空间来存储摩尔斯电码。
我们学习了如何验证摩尔斯电码。程序员可以使用空格分隔符分割字符串以获取字符串的所有单词。字符串的每个单词代表字母字符,我们可以检查该单词是否代表任何字符的摩尔斯电码。