WordBreak-FasterThan100%-Explained
public class Solution
{
    public IList<string> WordBreak(string s, IList<string> wordDict)
    {
        var result = new List<string>();
        Trie.Alphabet = new HashSet<int>();
        var rootTrie = new Trie();
        for (var i = 0; i < wordDict.Count; i++)
        {
            rootTrie.Set(wordDict[i]).Word = wordDict[i];
        }

        for (var i = 0; i < s.Length; i++)
        {
            if (!Trie.Alphabet.Contains(s[i])) return result;
        }

        Check(0, string.Empty);
        return result;

        void Check(int i, string sentence)
        {
            var trie = rootTrie;
            for (; i < s.Length; i++)
            {
                trie = trie.Get(s[i]);
                if (trie == null) return;
                if (trie.Position == 0) continue;
                Check(i + 1, $"{sentence} {trie.Word}");
            }

            if (trie.Position == 0) return;
            result.Add($"{sentence} {trie.Word}".TrimStart());
        }
    }

    public class Trie
    {
        public static HashSet<int> Alphabet { get; set; }
        public string Word { get; set; }
        public int LetterCode { get; set; }
        public List<Trie> Letters { get; set; }
        public int Position { get; set; }

        public Trie(int letterCode = -1)
        {
            LetterCode = letterCode;
            Letters = new List<Trie>();
        }

        public Trie Set(string word)
        {
            var trie = this;
            for (var i = 0; i < word.Length; i++)
            {
                trie = trie.Set(word[i]);
            }

            trie.Position = 1;
            return trie;
        }

        public Trie Set(int letterCode)
        {
            for (var i = 0; i < Letters.Count; i++)
            {
                var letter = Letters[i];
                if (letter.LetterCode == letterCode) return letter;
            }

            var trie = new Trie(letterCode);
            Letters.Add(trie);
            Alphabet.Add(letterCode);
            return trie;
        }

        public Trie Get(int letterCode)
        {
            for (var i = 0; i < Letters.Count; i++)
            {
                var letter = Letters[i];
                if (letter.LetterCode == letterCode) return letter;
            }

            return null;
        }
    }
}

Trie?

@Wikipedia
{
   A trie is an ordered tree data structure,
   It is used to store a dynamic set or associative array,
   The keys are usually strings
}   

Actually, it is a reusability method   

Remember()
{
   3x + 6y + 9z >> 3 (x + 2y + 3z)
   Because 3 is common in all terms
}   

Let Words = "CODE", "CODER", "CODERS", "CODING"   

Is there any common prefix in every word(term)?
{
   Yes >> "C"
}   

So >> Do not repeat "C" >> Reuse "C"
{
   Words = C(ODE, ODER, ODERS, ODING)
}   

Is there any common prefix in every term?
{
   Yes >> "O"
}   

So >> Do not repeat "O"
{
   Words = C(O(DE, DER, DERS, DING))
}   

Apply the same rule for all common prefixes   

Result?
{
   Trie = C(O(D(E(,R(,S)),ING)))
}

WhenToUse?

Let Words = "CODE", "CODER", "CODERS", "CODING"

So
{
   Trie = C(O(D(E(,R(,S)),ING)))
}

Compare()
{
   Searching(Words).Cost
   To
   Creating(Trie).Cost + Searching(Trie).Cost
}

Efficient For
{
   Spell checking
   Auto complete,
   Word games,
   Word . . .,
   . . .
}
I am open to any kind of feedback
Comments (0)