Check Permutation:给定两个字符串,判断其中一个是否是另一个的排列。
首先还是应该向面试官确定几个细节问题,大小写是否敏感,以及是否忽略空白。这道题假设大小写敏感,不忽略空白。
首先可以确定如果两个字符串长度不同则肯定返回false。下面的两种解法都利用了这一个优化。
如果两个字符串互为排列,那么有相同种类的字符,但是顺序不同,所以通过排序可以将两个字符串变成相同顺序的,然后只需比较排序后的结果。
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if(s1.size() != s2.size()) return false;
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
return s1 == s2;
}
};
尽管上面的方法不是最优的,但是它简洁并且很好理解。在工程中,这可能很重要。
然而如果效率是第一位的,那么就用下面的解法。
互为排列也可以理解为每种字符的数量相同,这样可以顺序遍历每个字符串来统计字符数量。这里依然假设只包含基本ASCII字符。
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if(s1.size() != s2.size()) return false;
int iCnt[128] = {0};
for(auto c : s1)
{
iCnt[c]++;
}
for(auto c : s2)
{
iCnt[c]--;
if(iCnt[c] < 0) return false;
}
return true;
}
};
1091

被折叠的 条评论
为什么被折叠?



