目录
题干
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
数据结构
这道题目采用的还是哈希表的思想,数据结构使用的是数组。因为英文字母的数量只有26个,所以使用数组即可
解题思路
先判断两个字符串的长度是否一致,若不一致直接return false
建立元素个数为26的数组table,用来记录字符串s里字符出现的次数,数组元素初始值均为0。接着遍历s字符串,每遇到一个字符,就将字符对应的哈希表索引下标(数组下标)所在的元素指加一,完成对字符串s的哈希表建立。
接着遍历t 字符串,每遇到一个字符,就将字符对应的哈希表索引下标(数组下标)所在的元素指减一。
因此,要判断s和t是否互为字母异位词只需要遍历 table,若每个元素的值均为0,则互为字母异位词,若不是则不互为字母异位词。
完整代码如下:
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length()!=t.length()){
return false;
}
int table[26]={0};
for(int i = 0; i< s.length();i++){
table[s[i]-'a']++;
}
for(int j = 0; j< t.length(); j++){
table[t[j]-'a']--;
}
for(int i = 0; i< 26; i++){
if(table[i]!=0)
return false;
}
return true;
}
};
使用到的函数
s.length()
是一个函数,用于获取字符串 s
的长度。它返回一个整数,表示字符串中字符的数量。
for(int i = 0; i< s.length();i++){
table[s[i]-'a']++;
}
因为字符a到字符z的ASCII是26个连续的数值,所以我们可以把字符映射到数组也就是哈希表的索引下标上。这样,字符a映射为下标0,相应的字符z映射为下标25。
这样的好处是,在遍历字符串s的时候,用s[i] - ‘a’就可以确定字符对应在哈希表上的索引下标 ,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。