leetcode767 重構字串C 解答

2021-10-11 01:27:19 字數 1394 閱讀 7026

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

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

示例 1:

輸入: s = 「aab」

輸出: 「aba」

示例 2:

輸入: s = 「aaab」

輸出: 「」

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

這道題是典型的貪心演算法的題。重構字串時,需要根據每個字母在字串**現的次數處理每個字母放置的位置。如果出現次數最多的字母可以在重新排布之後不相鄰,則可以重新排布字母使得相鄰的字母都不相同

當 n是偶數時,有 n/2個偶數下標和 n/2個奇數下標,因此每個字母的出現次數都不能超過 n/2次,否則出現次數最多的字母一定會出現相鄰。

當 n 是奇數時,由於共有 (n+1)/2 個偶數下標,因此每個字母的出現次數都不能超過 (n+1)/2 次,否則出現次數最多的字母一定會出現相鄰。

由於當 n 是偶數時,在整數除法下滿足 n/2 和 (n+1)/2 相等,因此可以合併 n 是偶數與 n 是奇數的情況:如果可以重新排布成相鄰的字母都不相同的字串,每個字母最多出現 (n+1)/2(次。

因此首先遍歷字串並統計每個字母的出現次數,如果存在乙個字母的出現次數大於 (n+1)/2,則無法重新排布字母使得相鄰的字母都不相同,返回空字串。如果所有字母的出現次數都不超過 (n+1)/2,則考慮如何重新排布字母。

解法1:先計數再排列

class

solution

//求計數

vector<

int>

counts(26

,0);

//26個元素,全部初始化為0

int maxcount =0;

int length = s.

length()

;for

(int i =

0; i < length; i++)if

(maxcount >

(length +1)

/2)//排列

string reorganizearray

(length,

' ')

;//初始化字串,全為空

int evenindex =

0, oddindex =1;

int halflength = length /2;

for(

int i =

0; i <

26; i++

)while

(counts[i]

>0)

}return reorganizearray;}}

;

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思路 ...