給定乙個字串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思路 ...