检查给定的摩尔斯电码是否有效


在这个问题中,我们将验证摩尔斯电码。摩尔斯电码方法用于将文本转换为编码格式,在电话发明之前,它对于在两个实体之间进行通信非常有用。

每个字母字符都有标准代码,包含“.”和“−”。代码是根据传输时间制定的,“.”表示短信号,“−”表示长信号。

但是,在本教程中,我们将使用标准化的摩尔斯电码来解码和验证字符串。

以下是标准化摩尔斯电码的表格。

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),因为我们使用常量空间来存储摩尔斯电码。

我们学习了如何验证摩尔斯电码。程序员可以使用空格分隔符分割字符串以获取字符串的所有单词。字符串的每个单词代表字母字符,我们可以检查该单词是否代表任何字符的摩尔斯电码。

更新于: 2023-07-17

200 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告