来源:力扣(LeetCode)
描述:
给定两个字符串 s1
和 s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
-
0 <= len(s1) <= 100
-
0 <= len(s2) <= 100
方法一:哈希表
字符串 s1 和 s2 互为字符重排等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s1 中字符出现的频次,然后遍历字符串 s2,减去 table 中对应的频次,如果出现 table[i] < 0,则说明 s2包含一个不在 s1 中的额外字符,返回 false 即可。
代码:
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if (s1.length() != s2.length()) {
return false;
}
vector<int> table(26, 0);
for (auto& ch: s1) {
table[ch - 'a']++;
}
for (auto& ch: s2) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.9 MB, 在所有 C++ 提交中击败了75.77%的用户
复杂度分析
时间复杂度:O(n),其中 nn 为 s1 的长度。
空间复杂度:O(S),其中 S 为字符集大小,此处 S = 26。
方法二:排序
字符串 s1 和 s2 互为字符重排等价于「两个字符串排序后相等」。因此我们可以对字符串 s1 和 s2 分别排序,看排序后的字符串是否相等即可判断。此外,如果 s1 和 s2 的长度不同,s2 必然不是 s1 的异位词。
代码:
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if (s1.length() != s2.length()) {
return false;
}
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
return s1 == s2;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.9 MB, 在所有 C++ 提交中击败了70.23%的用户
复杂度分析
时间复杂度: O(nlogn),其中 n 为 s1 的长度。排序的时间复杂度为 O(nlogn),比较两个字符串是否相等时间复杂度为 O(n),因此总体时间复杂度为 O(nlogn + n) = O(nlogn)。
空间复杂度: O(logn)。排序需要 O(logn) 的空间复杂度。
author:LeetCode-Solution