0x01 關於匹配字符串的最大長度問題
這類問題主要考慮採用動態滑框的方式
1. 尋找字符串中無重複字符的最長子串長度
字符串 s1 = ‘abcc’ 最長的子串爲 ‘abc’ 此時在後面加上字符 ‘d’, 變成字符串 s2 = ‘abccd’
要尋找s2的最大長度就要比較原本的 s1的最長串‘abc’, 以及加入新字母后的字符串長度‘ cd’ 挑選長的代替 可見還是原本的s1爲最長串
所以尋找最長串的動態滑框可以理解爲 在原有字符串上依次添加字母,然後與原有的串進行比對。代碼如下
def find_max(s):
if s = '':
return 0
if len(s) == 1:
return 1
length = 0
for i in range(0, len(s)):
length = max(length, find_left(s, i)
return length
首先排除特殊情況空串和只有一個字符的情況,隨後對字符串s進行依次遍歷,尋找最大串長度。
2. 尋找串中不重複字符的串長度
在尋找最大長度時採用從右向左的方式掃描字符串,代碼如下
def find_left(s, i):
tmp = s[i]
j = i-1
while j >= 0 and s[j] not in s:
tmp = tmp + s[j]
j = j - 1
return len(tmp)
0x02 二分查找
看到複雜度要求爲O(nlong(m)) 首先考慮二分查找
二分查找思想:
python中查找中位數的小技巧:
def find_mid(num):
half = len(num)//2
return (num[helf] + num[~half])/2
~half 表示負索引,即數列 [1,2,3,4,5,6] 2的索引爲1 那~2的索引爲 -(1+1)=-2