方法2:字典序的利用
給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 (從0開始)。如果不存在,則返回 -1。
示例:輸入: haystack = 「hello」, needle = 「ll」
輸出: 2
kmp演算法:分為兩部分,b陣列 和 正式匹配
b陣列 部分:找每個字元前的 最大相等前字尾長度:
比如 aba --> 乙個字首是 a,乙個字尾是 a,最大相等前字尾長度 為 1
比如 baba --> 乙個字首是 ba,乙個字尾是 ba,最大相等前字尾長度 為 2
比如 ababa --> 乙個字首是 aba,乙個字尾是 aba,最大相等前字尾長度 為 3
圖示即為b陣列的建立。
**部分:
class
solution
(object):
defstrstr
(self, haystack, needle)
:"""
:type haystack: str
:type needle: str
:rtype: int
"""iflen
(needle)==0
:return
0 b=self.creat_btable(needle)
j,i=0,
0while
(j <
len(haystack)):
if(needle[i]
== haystack[j]):
i=i+
1 j = j +
1elif
(i >
0and needle[i]
!= haystack[j]):
i=b[i]
elif
(i==
0and needle[i]
!= haystack[j]):
j = j +
1if i==
len(needle)
:return j-
len(needle)
return-1
defcreat_btable
(self, needle)
: j =-1
i =0# j在後面,i在前面
b=[j]while
(i <
len(needle)):
while
(j >=
0and needle[i]
!= needle[j]):
j = b[j]
i=i+
1 j=j+
1return b
給你乙個字串 s ,請你去除字串中重複的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小(要求不能打亂其他字元的相對位置)。
輸入:s = 「bcabc」
輸出:「abc」
題解:(構造棧)
1.因為不能打亂相對位置—即輸入中排在輸出第乙個字母位置前的字母都不能出現,所以要在保證每個字母至少出現一次的前提下再考慮字典序排列
2.根據第1點可以考慮使用單調棧來保證字典序排列,根據第2點我們給元素出棧時加上限制條件,只有在棧頂元素字典序靠後,且在之後還有出現次數才彈出棧.同時壓棧時應該注意棧中沒有出現過該元素才能壓棧.
class
solution
:def
removeduplicateletters
(self, s:
str)
->
str:
stack =
for idx, char in
enumerate
(s):
if char in stack:
continue
while stack and char < stack[-1
]and stack[-1
]in s[idx:]:
stack.pop(
)return
"".join(stack)
力扣394 字串解碼
這道題主要涉及的是對遞迴和棧的理解。給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格...
力扣 43 字串相乘
給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。示例 1 輸入 num1 2 num2 3 輸出 6 示例 2 輸入 num1 123 num2 456 輸出 56088 說明 num1 和 num2 的長度小於110。nu...
力扣 8 字串轉換整數
去掉左邊空字元 str str.lstrip 如果字串為空,返回0 if len str 0 return 0 設定預設輸出為0 last 0 如果有符號設定起始位置2,其餘的為1 if str 0 or str 0 i 2 else i 1 直到無法強制轉換為整數,跳出迴圈 while i len...