python求解最長字首公共子串

2021-10-13 22:40:57 字數 3837 閱讀 9559

編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 「」。

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

輸出: 「fl」

輸入: [「dog」,「racecar」,「car」]

輸出: 「」

解釋: 輸入不存在公共字首。

說明:所有輸入只包含小寫字母 a-z 。

字串之間進行比較,求最長字首公共子串,其實就是再求列表中所有字串的字首交集。所以,我們可以乙個字串乙個字串的比較。

第乙個字串與第二個字元進行比較求解最長字首公共子串,得到的最長字首公共子串再與下乙個字串進行比較,以此類推。如果在比較的過程**現了最長字首公共子串出現了空串就直接結束,因為空串與任何字串的公共子串都為空。

class

solution

:def

lcp(self,s1,s2)

:"""計算兩個字串的最長公共自創

:param s1:

:param s2:

:return:

"""#最長公共子串的長度不會超過短的字串

s_len =

min(

len(s1)

,len

(s2)

) index =

0while index < s_len:

if s1[index]

== s2[index]

: index +=

1else

:break

return s1[

:index]

deflongestcommonprefix

(self, strs:

list)-

>

str:

iflen

(strs)==0

:return

""#將列表第乙個字串賦值為最長公共子串

com_prefix = strs[0]

for s in strs[1:

]:#計算最長公共子串與後面字串的公共子串

com_prefix = self.lcp(com_prefix,s)

#如果最長公共子串為空,直接結束比較

iflen

(com_prefix)==0

:return

""return com_prefix

solution = solution(

)print

(solution.longestcommonprefix(

["dog"

,"racecar"

,"car"])

)

按列比較列表中每個字串中的每個字元是否相等,如果下標超過字串長度或比較的字元不相等就直接結束比較

class

solution

:def

longestcommonprefix

(self, strs)

->

str:

iflen

(strs)==0

:return

""#遍歷第乙個字串

for i in

range

(len

(strs[0]

)): com_prefix_c = strs[0]

[i]#遍歷後面的字串

for s in strs[1:

]:#如果字串的長度小於i或公共字元不相等

#就直接結束比對

iflen

(s)<= i or com_prefix_c != s[i]

:return strs[0]

[:i]

solution = solution(

)print

(solution.longestcommonprefix(

["flower"

,"flow"

,"flight"])

)

將字元列表對半拆分,一級一級拆分下去來求解最長字首公共子串

)二分法的解題思路是,先計算出字串列表中最小字串的長度,然後再比較前一半的字串是否相等,如果不相等,就比較前一半的一半,相等就比較前一半再增加後一半的一半,以此類推進行比較。

class

solution

:def

is_common_prefix

(self,index)

: com_prefix = self._strs[0]

[:index]

return

all(s[

:index]

==com_prefix for s in self._strs[1:

])deflongestcommonprefix

(self, strs)

->

str:

self._strs = strs

iflen(strs)==0

:return

"" min_s_len =

min(

len(s)

for s in strs)

low =

0 high = min_s_len -

1while low < high:

mid = low +

(high-low+1)

//2if self.is_common_prefix(mid)

: low = mid

else

: high = mid -

1return strs[0]

[:low]

solution = solution(

)print

(solution.longestcommonprefix(

["flower"

,"flow"

,"flight"])

)

參考:

leetcode解題思路

最長公共子串行求解

求多個字串的最長公共子串行可以轉化為逐步求2個字串的最長公共子串行來求解直至收斂,雖然過程會比較複雜一些。下面的 將採用動態規劃的方法來求解2個字串的最長公共子串行的問題,當然裡面還包含了測試例子 關於本 的詳情解釋請看演算法導論第二版 機械工業出版社 15章動態規劃15.3,看了你再執行 你會更容...

最長公共子串行求解

問題描述 求解兩個序列的最長公共子串行,而且這裡的子串行不要求是連續的。如string a abcdefg b adfbcdef 那麼最長公共子串行應該是abcdef。求解分析 暴力法求解 通過取得每個序列的所有子串行,如序列a有n個字元,那麼就有2的n次方個子序列,因為對於每個字元來說,都可以選擇...

最長公共字首 python

class solution def longestcommonprefix self,strs list str str ifnot strs return strs.sort 這應該是最重要的一步了,給陣列中的各個字串排序,排序之後的第乙個最短,最後乙個最長,所以直接拿第乙個和最後乙個比較就好了...