給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。思路:「兩相鄰的字元不同」 推出重複次數最多的字元不能超過n/2 + 1 個,否則不能構成符合條件的字串若可行,輸出任意可行的結果。若不可行,返回空字串。
示例 1:
輸入: s = 「aab」
輸出: 「aba」
示例 2:
輸入: s = 「aaab」
輸出: 「」
注意:s 只包含小寫字母並且長度在[1, 500]區間內。
生成雜湊表,記錄每個字元出現的個數,將最大字元(x)從雜湊表剔除
如果滿足條件,遍歷雜湊表,將x放在遍歷開頭加入,直到除x外的所有字元都追加完成
此時若還有x沒有追加到重構的字串裡,從重構的字串尾部判斷是否能追加插入x
另外,題目說了是純字母的,可以通過轉成int陣列來解決。效能上應該能提公升不少。習慣用通用解法,這裡編碼的時候就麼有寫。
按這個思路,其實自己覺得應該能挺快的。結果雖然不會超時,但是還是算不上乙個好的解法:
**如下:
class
solution
// 遍歷確定各元素個數
maphash =
newhashmap
<
>()
;int maxlength =0;
// 用於記錄最大的key
string maxkey = carr[0]
;for
(int i =
0; i < carr.length;
++i)
hash.
put(carr[i]
, currentsize);}
// 校驗是否滿足要求
if(maxlength > max)
// 如果沒有溢位, 則生成符合要求的字串
// 將最大的key作為開始,遍歷所有元素生成滿足要求的字串
string maxkeystr = maxkey;
char maxkeychar = maxkey.
charat(0
);hash.
remove
(maxkeystr)
; string ret ="";
while
(origlength--
>
0&& maxlength--
>0)
}// 如果hash裡的字母都寫完了,退出
if(origlength == maxlength)
}// 遍歷完尚未清空最大陣列,將剩餘的maxkey插入結果中
stringbuilder sbret=
newstringbuilder
(ret);if
(maxlength >0)
sbret.
insert
(ret.
length()
- i++
, maxkey);}
}return sbret.
tostring();}}
有些題解說先把x放在下標偶數字置,再隨意安插其他字元就可以得出解了,但是如果是aaaabbbbc
這種,a_a_a_a_
這樣安插完後,再隨意安插的話就有abacababb
,會出現重複的情況,這個還沒有get到題解的意思。
另外官方題解:重構字串看著可以說是比較權威了,值得研讀,先休息,明天學習下題解。
leetcode 刷題日記
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。採用乙個帶頭節點的指標head鏈結合併後的新指標,乙個空指標pre進行迴圈載入兩個鍊錶中的節點比較兩個鍊錶節點的值,pre指標鏈結較小值的鍊錶的節點,依次遍歷兩個鍊錶,直到乙個為空停止迴圈。複雜度分析 時間複...
leetcode 刷題日記
題目 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。解題思路 按照最長鍊錶的長度遍歷兩個...
leetcode刷題日記
給你兩個陣列,arr1 和 arr2,arr2 中的元素各不相同 arr2 中的每個元素都出現在 arr1 中 對 arr1 中的元素進行排序,使 arr1 中項的相對順序和 arr2 中的相對順序相同。未在 arr2 現過的元素需要按照公升序放在 arr1 的末尾。示例 輸入 arr1 2,3,1...