編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 「」。
輸入: [「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 這應該是最重要的一步了,給陣列中的各個字串排序,排序之後的第乙個最短,最後乙個最長,所以直接拿第乙個和最後乙個比較就好了...