You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

摩尔斯电码解码函数问题:无法正确添加单词间空格求助

解决摩尔斯电码解码时单词间空格无法正确添加的问题

你的代码核心问题在于拆分逻辑错误:使用preg_split('/\s+/', $morseCode, -1)会把所有连续空格(不管是1个还是3个)都当作分隔符,拆分后的数组里不会包含任何空格元素,导致循环中的else分支完全不会执行,自然无法检测到单词间的三个空格来添加明文空格。

下面提供两种可行的修正方案:

方案1:逐字符遍历统计空格

这种方式直接遍历电码的每个字符,通过统计连续空格数来区分字符分隔和单词分隔:

public function decode($morseCode)
{
    $plainText = '';
    $currentMorse = '';
    $spaceCount = 0;

    // 遍历每个字符
    for ($i = 0; $i < strlen($morseCode); $i++) {
        $char = $morseCode[$i];

        if ($char !== ' ') {
            // 先处理之前累积的空格:达到3个则添加单词分隔空格
            if ($spaceCount >= 3) {
                $plainText .= ' ';
            }
            $spaceCount = 0;
            $currentMorse .= $char;
        } else {
            $spaceCount++;
            // 单个空格代表字符分隔,解码当前累积的摩尔斯字符
            if ($spaceCount === 1 && !empty($currentMorse)) {
                if (isset($this->plainTextsByMorseCode[$currentMorse])) {
                    $plainText .= $this->plainTextsByMorseCode[$currentMorse];
                }
                $currentMorse = '';
            }
        }
    }

    // 处理最后一个未解码的摩尔斯字符
    if (!empty($currentMorse) && isset($this->plainTextsByMorseCode[$currentMorse])) {
        $plainText .= $this->plainTextsByMorseCode[$currentMorse];
    }

    return trim($plainText);
}

方案2:分两次拆分(更简洁)

先按三个空格拆分出单词,再对每个单词按单个空格拆分出字符,逻辑更清晰:

public function decode($morseCode)
{
    // 按三个空格拆分单词,过滤空元素
    $words = preg_split('/\s{3}/', $morseCode, -1, PREG_SPLIT_NO_EMPTY);
    $plainText = [];

    foreach ($words as $word) {
        // 按单个空格拆分单词内的摩尔斯字符
        $chars = preg_split('/\s/', $word, -1, PREG_SPLIT_NO_EMPTY);
        $plainWord = '';

        foreach ($chars as $morseChar) {
            if (isset($this->plainTextsByMorseCode[$morseChar])) {
                $plainWord .= $this->plainTextsByMorseCode[$morseChar];
            }
        }

        $plainText[] = $plainWord;
    }

    // 用单个空格连接所有明文单词
    return implode(' ', $plainText);
}

用你的测试用例-.-- --- ..- ... .... .- .-.. .-.. -. --- - .--. .- ... ...测试,两种方案都能正确输出YOU SHALL NOT PASS。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:12:55