哈希表-面试题01.02.判定是否互为字符重排-力扣(LeetCode)
一、题目解析
1、例如s1="abc",s2="bca",s2重排后"abc",返回true
2、s1和s2的长度为[0,100]
二、算法原理
解法:哈希表 O(N)
使用容器unordered_map显然过于笨重,我们可以注意到题目的字眼,小写字母,我们可以转而使用大小为26的数组模拟哈希表
1、使用两个哈希表 空间O(52)
分别统计s1和s2,然后循环比对,只要不相等就可以返回false,全部相同才为true
2、使用一个哈希表 空间O(26)
在统计s1或s2的基础上,统计s1或s2,统计前一个是加法,后一个做减法,并判断当<0,则返回false
细节:可以在开始对长度特判,如果s1.size()!=s2.size(),直接返回false
三、代码示例
class Solution {
public:bool CheckPermutation(string s1, string s2){if(s1.size()!=s2.size()) return false;int hash[26] = {0};for(auto ch : s1){hash[ch-'a']++;}for(auto ch : s2){hash[ch-'a']--;if(hash[ch-'a'] < 0)return false;}return true;}
};