leetCode 767 重構字串

2021-10-11 00:20:30 字數 1635 閱讀 6558

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。

若可行,輸出任意可行的結果。若不可行,返回空字串。

示例 1:

輸入: s =

"aab"

輸出:"aba"

示例 2:

輸入: s =

"aaab"

輸出:""

注意:

s 只包含小寫字母並且長度在[1, 500]區間內。

將出現頻率次數最多的字母重新排列後不相鄰,則可以重新排列字元使得相鄰的字母都不相同。如果字母的出現次數過多則無訪使得相鄰得字母都不相同。

假設字串長度為n:

首先統計字串中字元得出現次數,如果出現的最多次數超過了(n+1)/2則直接返回,否則將字元次數大於0的字元加入最大堆中,每次從最大堆中取出兩個字元重構字串,然後將剩餘出現次數大於0的字母重新加入到最大堆中,如果最大堆為空則完成了字串重構,如果最大堆只剩乙個字元則取出該字元拼接到重構字串最後。

class

solution

if(maxcount >

(len +1)

/2)// 建立乙個最大堆按照字元出現頻率排序

priorityqueue

queue =

newpriorityqueue

<

>

(new

comparator

()})

;// 將頻次大於0的字元加入堆中

for(

char c =

'a'; c <=

'z'; c++)}

stringbuilder sb =

newstringbuilder()

;while

(queue.

size()

>1)

if(counter[idx2]

>0)

}if(queue.

size()

>0)

return sb.

tostring()

;}}

統計字串中字元出現的次數,然後根據字元的出現次數重構字串,如果n為奇數且出現最多的字元的次數為(n+1)/2時,改字元只能放置在偶數下標,其餘情況每個字元放置在偶數下標還是奇數下標都是可行的。

維護偶數下標evenidx和奇數下標oddidx,初始值分別為0和1。遍歷字串的每乙個字元根據出現次數選擇放置的下標。

class

solution

if(maxcount >

(len +1)

/2)char

arr =

newchar

[len]

;int evenidx =

0, oddidx =1;

int halflen = len /2;

for(

char c =

'a'; c <=

'z'; c++

)while

(counter[c -

'a']

>0)

}return

newstring

(arr);}

}

Leetcode 767 重構字串

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 解題思路 任務排程問題,排序。本題有點像之前的乙個任務排程問題,由於題量太大,忘了哪乙個。統計當前...

leetcode 767 重構字串

描述 給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 s 只包含小寫字母並且長度在 1,500 區間內。思路從小到大,交叉著插入 bool cmp...

LeetCode 767 重構字串

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 s 只包含小寫字母並且長度在 1,500 區間內。通過次數13,259 提交次數30,089思路 ...