1. 程式人生 > >【leetcode】有效的字母異位詞(C、Python解答)

【leetcode】有效的字母異位詞(C、Python解答)

題目:

給定兩個字串 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迴圈中,還須繼續優化演算法!

博主暫時無法解決這個問題,求大佬指點!

歡迎評論!