leetcode劍指offer 字串

2021-10-05 17:11:49 字數 3302 閱讀 5254

二叉樹,鍊錶,字串

思路:進行兩次反轉

1.對整個句子反轉;2..對句子中的單詞反轉

經過三次反**

1.反轉前面的字串。2.反轉後面的字串。3.反轉整個字串

不能直接用力扣46全排列的**,力扣46是無重複的數字,這個題是有重複的。

正確的解法:不用not in tmp來判斷這個字母是否需要遍歷,定義乙個used矩陣來判斷,就不會去重了。

兩種方法:

1.用乙個棧空間複雜度是o(n)

2.直接在原煉表上操作,空間複雜度是o(1)

思路是,用快慢指標判斷中點位置,然後翻轉後面的乙個鍊錶,然後比較前後鍊錶。

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def reverse(self,head):

if not head.next:

return head

dummy=listnode(0)

dummy.next=head

pre=dummy

cur=dummy.next

curnext=dummy.next.next

cur.next=none

pre=cur

cur=curnext

curnext=curnext.next

while cur.next:

cur.next=pre

pre=cur

cur=curnext

curnext=curnext.next

cur.next=pre

return cur

def ispalindrome(self, head):

""":type head: listnode

:rtype: bool

"""if head is none or head.next is none:

return true

if head.next.next is none:

return head.val == head.next.val

#用快慢指標找到前半部分,後半部分。對後半部分鍊錶進行反轉。

slow=head

fast=head

while fast.next and fast.next.next:

slow=slow.next

fast=fast.next.next

#後半部分是slow.next

解題思路:

1.分冶法,統計字串各個字元出現的次數,如果有字元數量少於k,那麼包含這個位置的子串統統不成立。

遞迴地求解前半部分和後半部分。

2.光用遞迴會超時,先去除一下字串左右邊界不符合條件的部分。

lass solution(object):

def getcount(self,s):

count_dic={}

for i in range(len(s)):

count_dic[s[i]]=count_dic.get(s[i],0)+1

return count_dic

def longestsubstring(self, s, k):

""":type s: str

:type k: int

:rtype: int

"""#s中每個字母出現次數

count_dic=self.getcount(s)

#如果全部滿足條件,返回s的長度

flag=true

for value in count_dic.values():

if value

flag=false

if flag:

return len(s)

#去掉邊界不滿足條件的

left=0

right=len(s)-1

while count_dic[s[left]]

left=left+1

while count_dic[s[right]]

right=right-1

s=s[left:right+1]

count_dic=self.getcount(s)

#如果全部滿足條件,返回s的長度

flag=true

for value in count_dic.values():

if value

flag=false

if flag:

return len(s)

#不滿足條件,從不滿足條件的字母處分割

for i in range(len(s)):

if count_dic[s[i]]

left=self.longestsubstring(s[:i],k)

right=self.longestsubstring(s[i+1:],k)

return max(left,right)

return 0

leetcode 劍指 Offer 專題(七)

劍指 offer 專題第七部。題目 劍指 offer 66.構建乘積陣列。定義 begin v 1 i prod a k a 0 times a 1 times dots times a i 1 quad v 1 0 1 v 2 i prod a k a i 1 times dots times a...

Leetcode劍指offer系列 平衡二叉樹

傳送門 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,nul...

LeetCode 劍指offer刷題10 1

leetcode 劍指offer刷題 劍指 offer 10 i.斐波那契數列 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是...