判定是否互为字符重排--三种思路

0x01.问题

给定两个字符串 s1s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

《程序员面试金典》 01.02

0x02.多维思路分析

思路一:使用一个数组,记录字符的出现位数,若出现不相等的情况就返回false

bool CheckPermutation(string s1, string s2) {
        if(s1.size()!=s2.size()) return false;
        vector<int> map(26,0);
        for(char a:s1){
            map[a-'a']++;
        }
        for(char a:s2){
            map[a-'a']--;
            if(map[a-'a']<0) return false;
        }
        return true;
}

思路二:排序后直接比较

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;
}

思路三:使用异或,如果两字符串相应字符个数相等,异或结果一定为0。
这种思路应该是最好的了。

bool CheckPermutation(string s1, string s2) {
       int n=s1.size();
       if(s2.size()!=n) return false;
       int ans=0;
       for(int i=0;i<n;i++){
           ans=ans^s1[i]^s2[i];
       }
       return !ans;
}

ATFWUS --Writing By 2020–03–30

你可能感兴趣的:(算法,算法面试题集)