給定兩個字串 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 類似雜湊 還是重複問題 首先需要明白題的意思,其實就是比較兩個字串中字母是否相同,在相同的情況下比較該字元...