LeetCode解題-#14-Longest Common Prefix

Tong__Ming發表於2017-11-16

題目描述:
找出一組字串中的最長共同字首。

分析:
例如 abc, abd, ab,它們的最長共同字首是 ab。

思路:
學習過的 Trie 剛好能解決這個問題,雖然不會是最優解,但可以練練手。
Trie:http://blog.csdn.net/cuit/article/details/78495561

先定義好 Trie 樹 的資料結構:
這裡用 HashMap(C#中是 Dictionary)儲存樹的子結點,優點是不用儲存多餘的空陣列元素。
只實現了一個 Add(string s) 方法,用於新增字串。

    public class Trie
    {
        public TrieNode Root;
        public Trie()
        {
            Root = new TrieNode();
        }
        public void Add(string s)
        {
            TrieNode runNode = Root;
            for (int i = 0; i < s.Length; i++)
            {
                var children = runNode.Children;
                char c = s[i];
                TrieNode next = null;
                if (children.TryGetValue(c, out next))
                {
                    next = children[c];
                }
                if (next == null)
                {
                    children.Add(c, new TrieNode());
                }
                runNode = children[c];
            }
            runNode.IsEnd = true;
        }      
    }
    public class TrieNode
    {
        public bool IsEnd { get; set; }
        public Dictionary<char,TrieNode> Children { get; set; }

        public TrieNode()
        {
            Children = new Dictionary<char, TrieNode>();
            IsEnd = false;
        }
    }

然後依次把字串陣列插入Trie中,然後只要找到子結點的數量等於 1 且還有子結點時,即表示這些字串還在共同字首的樹枝中,反正即表示有分支了,也即這些字串不再有共同字首了。

    public string LongestCommonPrefix(string[] strs) {
        if(strs.Length == 0)
        {
            return "";
        }
        Trie t = new Trie();
        for(int i = 0; i < strs.Length; i++)
        {
            t.Add(strs[i]);
        }
        StringBuilder sb = new StringBuilder();
        TrieNode runNode = t.Root;
        while (runNode.Children.Count == 1 && !runNode.IsEnd)
        {
            var keys = runNode.Children.Keys;
            foreach(var k in keys)
            {
                sb.Append(k);
                runNode = runNode.Children[k];
            }
        }
       return sb.ToString();
    }

相關文章