题目链接
题目描述
给定两个字符串 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; } };
标签:NO.242,26,hash,异位,字母,数组,两串,LeetCode From: https://www.cnblogs.com/yihong-song/p/16951404.html