摩尔斯电码解码函数问题:无法正确添加单词间空格求助
解决摩尔斯电码解码时单词间空格无法正确添加的问题
你的代码核心问题在于拆分逻辑错误:使用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
相关产品推荐
相关产品推荐

