using System.Collections.Generic;
public static void Main()
string beginWord = "hit";
List<string> wordList = new List<string>(){ "hot", "dot", "dog", "lot", "log", "cog" };
Console.Write(LadderLength(beginWord, endWord, wordList));
public static int LadderLength(string beginWord, string endWord, IList<string> wordList)
Dictionary<string, List<string>> map = new Dictionary<string, List<string>>();
foreach (var word in wordList)
for (int i = 0; i < word.Length; i++)
var key = word.Substring(0, i) + '*' + word.Substring(i + 1);
if (!map.ContainsKey(key))
map.Add(key, new List<string>());
Queue<(string, int)> Q = new Queue<(string, int)>();
Dictionary<string, bool> visited = new Dictionary<string, bool>();
visited.Add(beginWord, true);
Q.Enqueue((beginWord, 1));
var wordCurr = val.Item1;
for (int i = 0; i < wordCurr.Length; i++)
string newKey = wordCurr.Substring(0, i) + '*' + wordCurr.Substring(i + 1);
foreach (var item in map[newKey])
if (!visited.ContainsKey(item))
Q.Enqueue((item, level + 1));