LeetCode:NO.242有效的字母異位詞
阿新 • • 發佈:2022-12-05
題目連結
題目描述
給定兩個字串 s
和 t
,編寫一個函式來判斷 t
是否是 s
的字母異位詞。
注意:若 s
和 t
中每個字元出現的次數都相同,則稱 s
和 t
互為字母異位詞。
示例 1:
輸入: s = "anagram", t = "nagaram"
輸出: true
示例 2:
輸入: s = "rat", t = "car"
輸出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
僅包含小寫字母
進階: 如果輸入字串包含 unicode 字元怎麼辦?你能否調整你的解法來應對這種情況?
解題思路
本題是讓判斷兩字串是否為字母異位詞,即兩串中出現的字母次數是否相同。如 “hi” 和 “hii” 就不符合。
本題我們有兩種思路解題,一種是將兩串中的元素進行排序,然後依次比較;另一種就要用到雜湊表的知識。
雜湊表有三種常見的結構:
陣列
set(集合)
map(對映)
在這裡,我們選擇陣列,因為串的字母組成較少,只有26個,我們只需定義大小為26的int陣列即可。
首先判斷兩串的長度是否相等,若不相等,則必定不滿足題意,返回false。
再依次遍歷兩個串中的每個元素:
hash[s[i]-'a']++ ,這句程式碼的意思是將串s的第i個位置上的字母的ASCII值與a做差值然後作為陣列下標傳給hash陣列。若第一個字母為a則hash[0]++;若為b,則hash[1]++。
hash[t[i]-'a']-- ,兩個串同時遍歷,遇到字母,一個對hash陣列對應位置進行加操作,一個進行減操作。
當兩個串遍歷完後,若hash陣列某一位置不為0,則說明兩串有不相同的字母,即不滿足字母異位詞。
程式碼實現
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[26]={0},i;
if(s.size()!=t.size())
return false;
for(i=0;i<s.size();i++){
hash[s[i] -'a']++;
hash[t[i]-'a']--;
}
for(i=0;i<26;i++)
if(hash[i]!=0)
return false;
return true;
}
};