当前位置: 面试刷题>> 单词接龙(经典算法150题)


题目描述补充

单词接龙游戏

题目要求实现一个单词接龙游戏的算法。在这个游戏中,玩家需要使用一系列单词,其中每个单词的尾字母是下一个单词的首字母(除了第一个单词的首字母和最后一个单词的尾字母外,这两个单词可以特殊处理,比如视为任意匹配)。游戏的目标是找出给定单词列表中所有可能的单词接龙序列。

输入

  • 一个字符串数组 words,包含所有可用的单词。
  • 一个可选的字符串 startWordendWord,分别表示接龙序列的起始和结束单词(如果未提供,则视为任意单词均可作为起始和结束)。

输出

  • 一个二维字符串数组,包含所有可能的单词接龙序列,从 startWord 开始到 endWord 结束。

示例

输入:

{
  "words": ["hit", "cog", "dog", "got", "top", "stop"],
  "startWord": "hit",
  "endWord": "cog"
}

输出:

[
  ["hit", "top", "cog"],
  ["hit", "top", "got", "dog", "cog"]
]

PHP 示例代码

function wordChain($words, $startWord, $endWord) {
    $result = [];
    $wordSet = array_flip($words); // 转换为哈希集合以提高查找效率
    $visited = array_fill_keys($words, false); // 标记单词是否已访问
    
    function dfs($path, $currentWord, &$result, &$wordSet, &$visited) {
        if ($currentWord === $endWord) {
            $result[] = $path;
            return;
        }
        
        $firstChar = $currentWord[0];
        for ($i = 1; $i < strlen($currentWord); $i++) {
            $nextChar = $currentWord[$i];
            $nextWord = $nextChar . substr($currentWord, 1);
            if (isset($wordSet[$nextWord]) && !$visited[$nextWord]) {
                $visited[$nextWord] = true;
                $path[] = $nextWord;
                dfs($path, $nextWord, $result, $wordSet, $visited);
                array_pop($path);
                $visited[$nextWord] = false;
            }
        }
    }
    
    $visited[$startWord] = true;
    $path = [$startWord];
    dfs($path, $startWord, $result, $wordSet, $visited);
    
    return $result;
}

// 示例用法
$words = ["hit", "cog", "dog", "got", "top", "stop"];
$startWord = "hit";
$endWord = "cog";
$result = wordChain($words, $startWord, $endWord);
print_r($result);

Python 示例代码

def wordChain(words, startWord, endWord):
    word_set = set(words)
    result = []
    
    def dfs(path, current_word):
        if current_word == endWord:
            result.append(path[:])
            return
        
        for i in range(1, len(current_word)):
            next_word = current_word[i:] + current_word[:i]
            if next_word in word_set and next_word not in path:
                path.append(next_word)
                dfs(path, next_word)
                path.pop()
    
    dfs([startWord], startWord)
    return result

# 示例用法
words = ["hit", "cog", "dog", "got", "top", "stop"]
startWord = "hit"
endWord = "cog"
result = wordChain(words, startWord, endWord)
print(result)

JavaScript 示例代码

function wordChain(words, startWord, endWord) {
    const wordSet = new Set(words);
    const result = [];
    
    function dfs(path, currentWord) {
        if (currentWord === endWord) {
            result.push([...path]);
            return;
        }
        
        for (let i = 1; i < currentWord.length; i++) {
            const nextWord = currentWord.slice(i) + currentWord.slice(0, i);
            if (wordSet.has(nextWord) && !path.includes(nextWord)) {
                path.push(nextWord);
                dfs(path, nextWord);
                path.pop();
            }
        }
    }
    
    const path = [startWord];
    dfs(path, startWord);
    return result;
}

// 示例用法
const words = ["hit", "cog", "dog", "got", "top", "stop"];
const startWord = "hit";
const endWord = "cog";
const result = wordChain(words, startWord, endWord);
console.log(result);

以上代码均实现了单词接龙游戏的算法,并给出了示例用法。注意,这些代码示例均不包含任何表情符号,并尽量精简地描述了问题及其解决方案。

推荐面试题