問題描述:
編寫乙個函式來查詢字串陣列中最長的公共字首字串。
如果沒有公共字首,則返回空字串""
。
例1:
輸入: ["flower","flow","flight"]
輸出: 「fl」
例2:
輸入: [「dog」,「racecar」,「car」]
輸出: 「」
說明:輸入字串中沒有公共字首。
注意:所有給定的輸入都是小寫字母a-z
。
方法1:水平掃瞄
low就是low,沒錯我最後就是用這種方法解決的,也是解決方法中最差的,捂臉,還是有待提高啊。
這種想法主要是lcp(s1…sn)=lcp(lcp(lcp(s1,s2),s3),…sn)
基於這種迭代想法,從左到右遍歷字串(s1,s2...sn),在每次迭代中找到最長公共字首,當最長公共字首是空時結束,返回空串,否則返回lcp(s1…sn)
}方法2:垂直掃瞄
想象一下,乙個非常短的字串位於陣列的末尾。上述方法仍將如此比較字串是不合理的。優化此案例的一種方法是進行垂直掃瞄。我們在移動到下一列之前,在同一列(字串的相同字元索引)上從上到下比較字元。
public string longestcommonprefix(string strs)
}return strs[0];
}
方法3:分而治之
演算法的思想來自於lcp操作的關聯屬性。我們注意到lcp(s1…sn)=lcp(lcp(s1…sk),lcp(sk+1…sn))
為了應用這種方案,我們採用分而治之的想法**問題lcp(si…sj),將其**為lcp(si…smid)和lcp(smid+1…sj)(其中mid= (i+j)/2),我們使用他們的解決方案lcpleft
並lcpright
構建主要問題的解決方案lcp(si…sj).為了實現這一點,我們逐個比較角色lcpleft
和lcpright
直到沒有角色匹配。找到的公共字首lcpleft
和lcpright就
是解決方案 lcp(si…sj)。
}方法4:二進位制查詢
我們的想法是應用二進位制搜尋方法來查詢具有最大值的字串l
,這是所有字串的通用字首。演算法搜尋空間是(0...minlen),其中minlen
最小字串長度和最大可能公共字首。每次搜尋空間被劃分為兩個相等的部分時,其中乙個被丟棄,因為它確定它不包含解決方案。有兩種可能的情況: 不是公共字串,
這意味著每個
都不是公共字串,我們丟棄搜尋空間的後半部分。 是公共字串,這意味著因為每個都是乙個公共字串而我們丟棄了搜尋空間的前半部分,因為我們試圖找到更長的公共字首。
附上大神**
public string longestcommonprefix(string strs)
return strs[0].substring(0, (low + high) / 2);
}private boolean iscommonprefix(string strs, int len)
進一步的思考/跟進
給定一組鍵s = [ s1,s2,...sñ],找到字串q
和s中最長的公共字首。此lcp查詢將被頻繁呼叫。
我們可以通過將一組鍵s儲存在trie中來優化lcp查詢.在trie中,從根開始的每個節點表示某些鍵的公共字首。但是我們需要找到字串q
和所有鍵字串的最長公共字首。這意味著我們必須從根找到最深的路徑,它滿足以下條件: 它是查詢字串的字首,q
沿路徑的每個節點必須只包含乙個子元素。否則,找到的路徑將不是所有字串中的公共字首。*路徑不包含標記為金鑰結尾的節點。否則,路徑不能是比其自身短的金鑰的字首a。
剩下的唯一問題是如何找到滿足上述要求的trie中最深的路徑。最有效的方法是從中構建乙個特定[s1...sn]字串。然後q
在trie中找到查詢字串的字首。我們從根部穿過trie,直到不可能繼續trie中的路徑,因為上述條件之一不滿足。
思想就是這樣,關於trie樹的實現,之後的文章有詳細講解,這裡不過多介紹。
牛人還是多啊,加油!!!
動態規劃之最長公共子串行 最長公共子串
題目 如果字串1的所有字元按其在字串中的順序出現在另外乙個字串2中,則字串1稱之為字串2的子串行。注意,並不要求子子串行 字串1 的字元必須連續出現在字串2中。請編寫乙個函式,輸入兩個字串,求它們的最長公共子串,並列印出最長公共子串行。例如 輸入兩個字串bdcaba和abcbdab,字串bcba和b...
動態規劃之最長公共子串行和最長公共子串
最長公共子串行,指兩個字串,子串行中最長的字串。不一定是連續字元 最長公共子串行長度 intlcs length const string str1,const string str2,vectorint veca for j 0 j str2.length j for i 1 i str1.len...
LeetCode之最長公共字首
近期開始為了找實習開始刷leetcode,吃了大學不好好鍛鍊寫 能力虧的,現在一邊刷,一邊記錄下。最長公共字首就是給定字串陣列,讓輸出最長的公共字首。最長公共字首不會比陣列中的最短的字串長,首先將該陣列中的第乙個字串作為起始的最短字串,然後與後面的字串進行比較,然後變換最短字串。再進行字元的比較,選...