leetcode每日一題 767 重構字串

2021-10-11 01:23:11 字數 1144 閱讀 2279

題目:

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。

思路:

1.先利用字典統計 字串中各字元出現的次數;若存在某個字元,其出現次數大於 (字串長度+1)/2,則return 空字串;否則考慮其字元重新排列的問題;

2.利用堆重新排列字串

解答:

class

solution

:def

reorganizestring

(self, s:

str)

->

str:

res =

"" dic=

n=len(s)

for i in

range

(n):

if s[i]

in dic:

dic[s[i]]+=

1else

: dic[s[i]]=

1for t in dic.values():

if t>

(n+1)//

2:return res

# 將字母新增到堆中

pq =

for key,val in dic.items():

(-val,key)

)print

(pq)

#初始化乙個元組變數prev,記錄上次去掉的字元和它的個數

prev =(0

,none

)# 開始重構字串

while pq:

#當堆不為空,彈出堆頂元素

#將堆頂字元新增進結果字串

res += k

#若prev的個數大於0,則將其壓入堆中

if prev[0]

<0:

#將prev置為當前字元

prev =

(v+1

,k)return res

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

LeetCode每日一題(題1028)

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...

LeetCode每日一題(題139)

題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...