演算法 最長公共字首

2021-10-23 02:39:06 字數 2175 閱讀 2001

題目描述

編寫乙個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 「」。

示例 1:

輸入: [「flower」,「flow」,「flight」]

輸出: 「fl」

示例 2:

輸入: [「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...