【leetcode】有效的字母異位詞(C、Python解答)
阿新 • • 發佈:2018-12-16
題目:
給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。
示例 1:
輸入: s = "anagram", t = "nagaram" 輸出: true
示例 2:
輸入: s = "rat", t = "car" 輸出: false
說明: 你可以假設字串只包含小寫字母。
進階: 如果輸入字串包含 unicode 字元怎麼辦?你能否調整你的解法來應對這種情況?
解題思路:
統計兩個字串中各字母的出現次數,相同,則返回true;不同,則返回false。
Python解答:
用Python實現比較方便,使用Collections模組下的counter函式統計各字母出現的次數,返回一個字典。
使用operator模組下的eq(dic1,dic2),比較兩個字典是否相同:相同則返回true,否則返回false
程式碼上:
簡單,整潔!
class Solution: def isAnagram(self, s, t): """ :type s: str :type t: str :rtype: bool """ dic1=collections.Counter(s) dic2=collections.Counter(t) return operator.eq(dic1,dic2)
效率上:
如圖,可見還是相當不錯的!
C解答:
事實上,我的C並未做出來!原因是超時!
在此寫出是為了獲得大佬們的指點也為小白提供一點思路!
思路:
利用字母的ascill表,將各字母出現的次數儲存在陣列中:ascill碼為索引,值為出現的次數
舉個例子:
s='aabbcd'
a 的ascill碼為97,所以在陣列中儲存為:arry[97]=2
相當於在C語言中實現了一個字典的資料結構!
後面就剩下陣列的比對工作了,在此不再贅述.....
第一次嘗試的C程式碼:
bool isAnagram(char* s, char* t) { int i,num1[256]={0}; int num2[256]={0}; for(i=0;i<strlen(s);i++) num1[(int)s[i]]++; for(i=0;i<strlen(t);i++) num2[(int)t[i]]++; for(i=0;i<256;i++) { if(num1[i]!=num2[i]) return false; } return true; }
奈何沒通過時間限制的檢測,於是,就有了2.0版本:
bool isAnagram(char* s, char* t) {
int i,num1[123]={0};
int num2[123]={0};
if(strlen(s)!=strlen(t)) return false;
for(i=0;i<strlen(s);i++)
{
num1[(int)s[i]]++;
num2[(int)t[i]]++;
}
//小寫字母的ascill碼在97——123之間
for(i=97;i<123;i++)
{
if(num1[i]!=num2[i]) return false;
}
return true;
}
但是依舊超時,可見主要耗時的部分在第一個for迴圈中,還須繼續優化演算法!
博主暫時無法解決這個問題,求大佬指點!
歡迎評論!