珍寶鴨的力扣練習(1) 字串特殊方法合集

2021-10-04 06:19:07 字數 2205 閱讀 9352

方法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...