原题目
面试题 01.02. 判定是否互为字符重排
给定两个字符串 s1
和 s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-permutation-lcci/
第一遍解法
使用unordered_map容器,记录第一个字符串每个字母出现的次数,然后再从第二个字符串依次删除,若最后size为0,表示两个字符串可以通过重新排列转换。
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
unordered_map<char, int> char_count;
for (char c : s1) {
++char_count[c];
}
for (char c : s2) {
--char_count[c];
if (char_count[c] == 0) {
char_count.erase(c);
}
}
return char_count.size() == 0;
}
};
时间复杂度: O(n)
空间复杂度: O(M + N)
网上好的解法
STL中的sort方法
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
return s1 == s2;
}
};
时间复杂度: O(n)
空间复杂度: O(1)
最后的代码
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
return s1 == s2;
}
};
思考
- 要善于使用STL中自带的方法,例如sort。