編寫乙個函式來查詢字串陣列中的最長公共字首。
如果不存在公共字首,返回空字串""
。
示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共字首。
說明:所有輸入只包含小寫字母a-z
。
本題大概有四種解法:
1. 橫向掃瞄:比較前兩個字串的公共字首,將結果與第三個字串進行比較得到前三個字串的公共字首,再將結果與第四個字串比較,直至最後乙個字串,時間複雜度為o(n*m), n是字串的個數,m是字串的平均長度。
2. 縱向掃瞄:掃瞄每個字串的第乙個字元,如果全部相等則繼續掃瞄每個字串的第二個字元,當不是全部相等時返回前面掃瞄過的子串,時間複雜度為o(n*m)
3. 字首樹:所求最長公共字首一定是每個字串的字首子串,故可以把其中乙個字串作為標準,然後將其字首串與所有其他字串進行比較,判斷該字首串是否是所有其他字串的字首
4.字首樹:以其中乙個字串為標準,遍歷該字串在樹中的節點資訊,第乙個出現分支的節點即為要找的分割點,從根節點到該點的字串即為所求最長公共字首
一 字首樹
概述字首樹又名字典樹,單詞查詢樹,trie樹,是一種多路樹形結構,是雜湊樹的變種,和hash效率有一拼,是一種用於快速檢索的多叉樹結構。
典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。
trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。
trie樹也有它的缺點,trie樹的記憶體消耗非常大。
性質:不同字串的相同字首只儲存乙份。
操作:查詢,插入,刪除。
舉個栗子:給出一組單詞,inn, int, at, age, adv,ant, 我們可以得到下面的trie:
從上面可以發現一些trie樹的特性:
1)根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。
2)從根節點到某一節點的路徑上的字元連線起來,就是該節點對應的字串。
3)每個節點的所有子節點包含的字元都不相同。
4)每條邊對應乙個字母。每個節點對應一項字首。葉節點對應最長字首,即單詞本身。
單詞inn與單詞int有共同的字首「in」, 因此他們共享左邊的一條分支,root->i->in。同理,ate, age, adv, 和ant共享字首"a",所以他們共享從根節點到節點"a"的邊。
查詢操縱非常簡單。比如要查詢int,順著路徑i -> in -> int就找到了。
搭建trie的基本演算法也很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則建立對應的節點和邊。比如要插入單詞add,就有下面幾步:
考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。
考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad
考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。
具體**:
//定義字首樹的節點的資料結構
struct trienode
//實現trie字首樹
class trie
/** inserts a word into the trie. */
void insert(string word)
currentnode->isword = true;
}/** returns if the word is in the trie. */
bool search(string word)
else
}return currentnode->isword;
}string startswith(string word, int nword)
}if (count == 1)
else
if (currentnode->next[word[i] - 'a']->isword) //當字首樹某一節點是單詞的標誌時即停止查詢
currentnode = currentnode->next[word[i] - 'a'];
}return result;
}//14最長公共字首
string longestcommonprefix(vector& strs)
for (int i = 0; i < n; i++)
string result = startswith(strs[0], n); //查詢過程
return result;}};
最後附上測試結果
LeetCode14最長公共字首
編寫乙個函式來查詢字串陣列中最長的公共字首字串。例如 輸出 ab 比較乙個字串陣列的最長公共字首,遍歷整個字串陣列,建立乙個字串用來儲存當前最長公共字串,逐個比較,不斷更新公共字串內容。情況比較多,考慮周全,不然可能會陣列溢位。公共字串的長度和當前比較字串的長度大小的比較,避免陣列越界,還有空字串的...
LeetCode 14 最長公共字首
編寫乙個函式來查詢字串陣列中最長的公共字首字串。用第乙個字串s,比較strs的每個字串的公共字首,並記錄字首有m位,之後輸出s的前m位字元即可。但是在輸出過程中,使用了如下的賦值方式 for int i 0 i m i ans i s i 在string型別中,內部的成員是private的,所以不能...
LeetCode14 最長公共字首
題目描述 編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母a z。如下 class solutio...