题目: 给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:0 <= len(s1) <= 100 ;0 <= len(s2) <= 100
思路
(一)哈希解决,O(N) S(N)
也可以用数组来存储每次出现的次数,道理一样,哈希表主要有两种办法:
- 第一种是
定义两个哈希表
,分别统计字符串中字符出现的个数。最后比较两个哈希中出现字符次数是否一致,不一致返回false。
//1.哈希,比较两个的次数
bool CheckPermutation1(string s1, string s2)
{
if(s1.size()!=s2.size())
return false;
unordered_map<int,int> hash1;
unordered_map<int,int> hash2;
for(int i=0;i<s1.size();i++)
{
hash1[s1[i]]++;
}
for(int i=0;i<s2.size();i++)
{
hash2[s2[i]]++;
}
for(int i=0;i<hash1.size();i++)
{
if(hash1[s1[i]]!=hash2[s1[i]])
return false;
}
return true;
}
- 第二种
定义一个哈希表
,统计s1字符串出现的次数,++;统计s2出现的次数,–;这样如果每个字符出现的次数一样,那么最后哈希表中的次数应该为0。
//2.哈希,将两个字符串存储到一个哈希表中,s1++,s2--,那么最后hash的次数为0,则正确O(N)S(N)
bool CheckPermutation2(string s1, string s2)
{
if(s1.size()!=s2.size())
return false;
unordered_map<int,int> hash;
for(int i=0;i<s1.size();i++)
{
hash[s1[i]]++;
}
for(int i=0;i<s2.size();i++)
{
hash[s2[i]]--;
}
for(auto i:hash)
{
if(i.second!=0)
{
return false;
}
}
return true;
}
(二)排序比较,O(logN) S(1)
可以利用系统自带函数sort进行排序,排序后进行比较即可。
//3 用sort排序 0(logN)S(1)
bool CheckPermutation(string s1, string s2)
{
sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
return s1 == s2;
}
int main()
{
cout<<CheckPermutation("asvnpzurz","urzsapzvn");
}
加油哦!💪。