每日演算法 重構字串

2021-10-11 01:51:52 字數 634 閱讀 3710

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

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

示例 1:

輸入: s = "aab"

輸出: "aba"

示例 2:

輸入: s = "aaab"

輸出: ""

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

前面返回空的判斷就不加以贅述了,直接說後面的解法:

方法一:基於最大堆的貪心演算法:

維護最大堆儲存字母,堆頂元素為出現次數最多的字母,然後將出現次數大於0的字母加入最大堆。

當最大堆的元素個數大於1時,每次從最大堆取出兩個字母,拼接到重構的字串,然後將兩個字母出現的次數分別減1,並將剩餘出現次數大於0的字母重新加入最大堆。因為最大堆中的元素都是不同的,所以取出來的兩個字母也肯定都是不同的,將兩個不同的字母重新拼接到新的重構字串,可以確保相鄰的字母不相同。

方法二:基於計數的貪心演算法:

首先統計每個字幕出現的次數,然後根據每個字母出現的次數重構字串。

當n是奇數且出現的字母次數是(n+1)/2時,出現次數最多的字母必須全部放置在偶數下標,否則一定會出現相鄰的字母相同的情況,其餘情況下,每個字母放置在偶數下標或者奇數下標都是可行的

重構字串

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。輸入 s aab 輸出 aba 輸入 s aaab 輸出 string reorganizestring string s 判斷是否能夠重構 if h 0 second s.size...

重構字串

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 void main unordered map int,int mp int maxlen 0 for i...

LeetCode 字串 重構字串

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 輸入 s aab 輸出 aba 輸入 s aaab 輸出 說明 假設 s 中有多個 a,則我們想讓字串排成 axaxax 的形式。我們可以先統計每個字元出現的次數,然後利用間隔...