242 有效的字母異位詞

2021-10-04 06:04:39 字數 1967 閱讀 7465

給定兩個字串 s 和 t ,編寫乙個函式來判斷 t 是否是 s 的字母異位詞。

示例 1:

輸入: s = "anagram", t = "nagaram"

輸出: true

示例 2:

輸入: s = "rat", t = "car"

輸出: false

說明:你可以假設字串只包含小寫字母。

高階:如果輸入字串包含 unicode 字元怎麼辦?你能否調整你的解法來應對這種情況?

演算法:通過將 s 的字母重新排列成 t 來生成變位詞。因此,如果 t 是 s 的變位詞,對兩個字串進行排序將產生兩個相同的字串。此外,如果 s 和 t 的長度不同,t 不能是 s 的變位詞,我們可以提前返回。

**如下

void swap(char* a, char* b)

void strsort(char* str)

}puts(str);

}bool isanagram(char* s, char* t)

上述**是沒有問題的,但是提交時卻給出了「超出時間限制」錯誤提示,如下圖所示。

確實,上述演算法本身沒問題,出問題的應該是排序演算法,由於使用的氣泡排序,使得時間複雜度達到o(n

2)o(n^2)

o(n2

),因此考慮採用效率更高的歸併排序。為什麼選用歸併而不是選擇排序呢?因為歸併排序的效能不受輸入資料的影響,並且表現比選擇排序好的多,因為歸併始終都是 o(n

logn

)o(nlogn)

o(nlog

n)的時間複雜度。而代價則是需要額外的記憶體空間。(注:關於歸併排序演算法的相關介紹,請出門左轉看我下篇論述)

採用歸併排序後的**如下(通過):

int min(int a, int b)

void merge_sort(char* str)

char* temp = ptr;

ptr = newstr;

newstr = temp;

}if (ptr != str)

free(newstr);

}bool isanagram(char* s, char* t)

emmm……雖然通過了,但是結果好像並不感人啊

尤其是記憶體占用,簡直了!

沒有比這個更糟糕的了。當然了,大家也可以用快排來做,但是結果應該不會很理想。

那有沒有更好地方法呢?

答案是:有的!

思路

**如下:

bool isanagram(char* s, char* t)

; for (int i = 0; i < s_len; i++)

for (int i = 0; i < 26; i++)

return true;

}

**執行用時圖如下:

複雜度分析

242 有效的字母異位詞

給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。示例 1 輸入 s anagram t nagaram 輸出 true示例 2 輸入 s rat t car 輸出 false說明 你可以假設字串只包含小寫字母。class solution object def isa...

242 有效的字母異位詞

給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。示例 1 輸入 s anagram t nagaram 輸出 true 示例 2 輸入 s rat t car 輸出 false 說明 你可以假設字串只包含小寫字母。class solution def isanagra...

242 有效的字母異位詞

給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。輸入 s anagram t nagaram 輸出 true輸入 s rat t car 輸出 false方法1 類似雜湊 還是重複問題 首先需要明白題的意思,其實就是比較兩個字串中字母是否相同,在相同的情況下比較該字元...