找出一个字符串中出现次数最多的字_487,重构字符串
想了解更多數據結構以及算法題,可以關注微信公眾號“數據結構和算法”,每天一題為你精彩解答。
問題描述
給定一個字符串S,檢查是否能重新排布其中的字母,使得兩相鄰的字符不同。
若可行,輸出任意可行的結果。若不可行,返回空字符串。
示例 1:
輸入: S = “aab”
輸出: “aba”
示例 2:
輸入: S = “aaab”
輸出: “”
注意:
- S 只包含小寫字母并且長度在[1, 500]區間內。
問題分析
這題是讓重新排布字符串S中的字符,讓任何兩個相鄰的字符都不相同,如果能做到就返回排布后的字符串,如果做不到就返回空字符串。
如果要使得兩相鄰的字符不同,那么出現次數最多的那個數的數量必須滿足下面條件,如下圖所示,比如下面的a是出現次數最多的
這個時候a的數量已經達到了臨界值,如果再多一個a,那么至少有兩個a是相鄰的。所以這里出現次數最多的那個字符數量的臨界值是threshold = (length + 1) >> 1(其中 length 是字符串的長度)
如果能使得兩相鄰的字符不同,我們可以先把出現次數最多的那個字符放到新數組下標為偶數的位置上,也就是從數組的第一個位置開始放,放完之后在用其他的字符填充數組剩下的下標為偶數的位置,如果下標為偶數的位置都填滿了,我們就從下標為1開始,也就是數組的第2個位置開始,填下標為奇數的位置。
注意這里能不能先把出現次數最多的字符放到字符串下標為奇數的位置呢,當然是不可以的。比如我們上面舉的例子abacaba本來是可以滿足的,如果放到下標為奇數的位置,最后一個 a 就沒法放了,除非放到最前面,那又變成了放到下標為偶數的位置了。
代碼如下
public String reorganizeString(String S) { //把字符串S轉化為字符數組 char[] alphabetArr = S.toCharArray(); //記錄每個字符出現的次數 int[] alphabetCount = new int[26]; //字符串的長度 int length = S.length(); int max = 0, alphabet = 0, threshold = (length + 1) >> 1; //找出出現次數最多的那個字符 for (int i = 0; i < length; i++) { alphabetCount[alphabetArr[i] - 'a']++; if (alphabetCount[alphabetArr[i] - 'a'] > max) { max = alphabetCount[alphabetArr[i] - 'a']; alphabet = alphabetArr[i] - 'a'; //如果出現次數最多的那個字符的數量大于閾值, // 說明他不能使得兩相鄰的字符不同, // 直接返回空字符串即可 if (max > threshold) return ""; } } //到這一步說明他可以使得兩相鄰的字符不同, // 我們隨便返回一個結果,res就是返回 //結果的數組形式,最后會再轉化為字符串的 char[] res = new char[length]; int index = 0; //先把出現次數最多的字符存儲在數組下標為偶數的位置上 while (alphabetCount[alphabet]-- > 0) { res[index] = (char) (alphabet + 'a'); index += 2; } //然后再把剩下的字符存儲在其他位置上 for (int i = 0; i < alphabetCount.length; i++) { while (alphabetCount[i]-- > 0) { //如果偶數位置填完了,我們就讓index從1開始, // 填充下標為奇數的位置 if (index >= res.length) { index = 1; } res[index] = (char) (i + 'a'); index += 2; } } return new String(res);}總結
這題直接判斷比較簡單,我們只需要統計出出現次數最多的字符即可。但這題還要返回結果,所以最簡單的方式就是把出現次數最多的字符從數組的第一個位置開始放,每隔一個放一次。放完之后再用其他的字符從后面接著放,也是每隔一個,如果超出數組之后再從數組的第2個位置開始放,也是每隔一個,這樣就能保證結果一定不會出錯,并且也少了很多的判斷。
總結
以上是生活随笔為你收集整理的找出一个字符串中出现次数最多的字_487,重构字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 诺基亚n1平板电脑刷机教程_【个人记事本
- 下一篇: python tkinter布局混用_[