[英]Merging and sorting n strings in O(n)
最近,我在編碼挑戰中遇到一個問題,我必須合並n個字母數字字符的字符串,然后對新的合並字符串進行排序,而只允許在排序的字符串中使用字母字符。 現在,這將是相當簡單的,除了增加的警告是算法必須為O(n)(它沒有指定這是時間還是空間復雜性,還是兩者都沒有)。
我最初的方法是將字符串連接成一個新字符串,只添加字母字符,然后在末尾排序。 我想提出一個更有效的解決方案,但是給我的時間少於最初告訴我的時間。 (我所知道的)沒有在O(n)時間內運行的排序算法,所以我唯一能想到的是我可以增加空間復雜度並使用排序的哈希表(例如C ++映射)進行存儲每個字符的計數,然后按排序順序打印哈希表。 但這可能需要n次打印n個字符,因此我認為它仍將以二次時間運行。 另外,我使用的是python,但我認為它沒有辦法使字典保持排序(也許可以)。
無論如何,是否可以在O(n)時間和/或空間復雜度中解決此問題?
您的計數排序是要走的路:建立了26個字母的簡單計數表中的順序。 遍歷兩個字符串,計算字母,忽略非字母。 這是O(n)的一遍。 現在,只需遍歷表格,按指示的次數打印每個字母。 這也是O(n),因為計數的總和不能超過n
。 您不會每次打印n
字母n
: 總共要打印n
字母。
因為每個步驟都是O(n),所以整個事情都是O(n)
[@patatahooligan:在我看到您的評論之前進行了此編輯,不小心重復了答案]
如果我正確理解了要求,那么您只是在對字符串中的字符進行排序?
即ADFSACVB
變為AABCDFSV
?
如果是這樣,那么訣竅就是不要真正“排序”。 您有固定數量的值。 因此,您只需對每個值進行計數並從中生成結果。
例如,鑒於ABACBA
在第一遍中,在由字符索引的數組中增加一個計數器。 這將產生:
[A] == 3 [B] == 2 [C] == 1
在第二遍輸出中,計數器指示的每個字符的編號。 AAABBC
總而言之,系統會告訴您進行排序 ,但要跳出框框思考,您確實需要計數算法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.