1. 程式人生 > 實用技巧 >20.11.30 leetcode767

20.11.30 leetcode767

題目連結:https://leetcode-cn.com/problems/reorganize-string/

題意:給你一個字串,問是否可以把字串重新排列,使得任意相鄰字母不同。

分析:不存在的情況就是出現次數最多的字母超過了ceil(len/2)。

排字母時要注意一個極限情況,就是字串長度為奇數,且字母出現次數最多為(n+1)/2,如長度為7,最多字母出現次數為4,這時候這個字母只有一種排序方式,那就是填滿所有偶數下標(0,2,4,6)。因為偶數下標可能被這種極端情況佔用,故我們優先填充奇數下標,因為先填偶數下標可能會破壞這種極端情況,使得出現次數最多的字母無法填完。

class Solution {
public: string reorganizeString(string S) { int book[26]; memset(book,0,sizeof(book)); int n=S.size(); if(n<=2)return S; for(int i=0;i<n;i++){ book[S[i]-'a']++; } int mx=-1; for(int i=0;i<26;i++){ mx=max(mx,book[i]); }
//cout<<ceil(n/2.0); if(mx>ceil(n/2.0))return ""; string ans(n,' '); int half=n/2; int evenIndex=0,oddIndex=1; for(int i=0;i<26;i++){ char c=char(i+'a'); while(book[i]>0&&book[i]<=half&&oddIndex<n){ ans[oddIndex]
=c; book[i]--; oddIndex+=2; } while(book[i]>0){ ans[evenIndex]=c; book[i]--; evenIndex+=2; } } return ans; } };