題目描述
編寫乙個函式來查詢字串陣列中的最長公共字首。
如果不存在公共字首,返回空字串 「」。
示例 1:
輸入: [「flower」,「flow」,「flight」]示例 2:輸出: 「fl」
輸入: [「dog」,「racecar」,「car」]說明:輸出: 「」
解釋: 輸入不存在公共字首。
所有輸入只包含小寫字母 a-z 。解題
使用分治法求解,找出左側部分的最大公共字首與右側部分的最大公共字首進行比較。
public string longestcommonprefix
(string[
] strs)}if
(f)return lprefix.
substring(0
, index)
;}
來自官方的題解
方法一:水平掃瞄法
先以第乙個字串為字首,與後面的比較找出新的公共字首,以此類推遍歷陣列。indexof(prefix)若找不到公共串則返回-1,然後將字首從末尾去掉乙個字元繼續比較。
public string longestcommonprefix
(string[
] strs)
return prefix;
}
方法二:水平掃瞄
(名字是不是錯了?)
依次取第乙個字串的每個字元與其他字串相應的字元進行比較,若不等或當前字元索引等於陣列中最短的字串長度(說明這個最短字串就是最長字首),則找出結果。
public string longestcommonprefix
(string[
] strs)
}return strs[0]
;}
方法三:分治法
public string longestcommonprefix
(string[
] strs)
private string longestcommonprefix
(string[
] strs,
int l,
int r)
else
}string commonprefix
(string left,string right)
return left.
substring(0
, min)
;}
方法四:二分法
這個二分法分的是字串,上面的分治法分的是陣列。
每一次將查詢區間一分為二,然後丟棄一定不包含最終答案的那乙個。演算法進行的過程中一共會出現兩種可能情況:簡單來說就是:s[1…mid] 不是所有串的公共字首。 這表明對於所有的 j > i s[1…j] 也不是公共字首,於是我們就可以丟棄後半個查詢區間。
s[1…mid] 是所有串的公共字首。 這表示對於所有的 i < j s[1…i] 都是可行的公共字首,因為我們要找最長的公共字首,所以我們可以把前半個查詢區間丟棄。
將乙個字串二分,取前半段進行比較,若這前半段是所有串字首,就說明公共字首是前半段加上後半段的一部分,那麼前半段可以捨去,再去後半段二分查詢。
若前半段不是所有串字首,則說明公共字首在前半段,後半段就不用管了。
這裡二分字串要按照最短字串的長度取中值。
public string longestcommonprefix
(string[
] strs)
return strs[0]
.substring(0
,(low + high)/2
);}private
boolean
iscommonprefix
(string[
] strs,
int len)
演算法 最長公共字首
編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 輸入 flower flow flight 輸出 fl 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。class solution 對result擷取公共部分 result result.substr...
最長公共字首
描述 給k個字串,求出他們的最長公共字首 lcp 樣例 在 abcd abef 和 acef 中,lcp 為 a 在 abcdefg abcefg abcefa 中,lcp 為 abc 新知識點 vectorstrs既可以是一維的,也可以是多維的。在這裡講解三維的初始化。vector str str...
最長公共字首
編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母a z。class solution object...