刷題日記 leetcode 767 重構字串

2021-10-11 01:39:23 字數 1882 閱讀 8488

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

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

示例 1:

輸入: s = 「aab」

輸出: 「aba」

示例 2:

輸入: s = 「aaab」

輸出: 「」

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

思路:「兩相鄰的字元不同」 推出重複次數最多的字元不能超過n/2 + 1 個,否則不能構成符合條件的字串

生成雜湊表,記錄每個字元出現的個數,將最大字元(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...