b_lc_确定两个字符串是否接近(思维题:分类讨论)

用两种操作使两个字符串是是偶发接近

  • 操作 1:交换任意两个 现有 字符。
    例如,abcde -> aecdb
  • 操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另一个字符执行相同的操作。
    例如,aacabb -> bbcbaa(所有 a 转化为 b ,而所有的 b 转换为 a )

思路:分类讨论

  • 当两个字符串中的频次都一样时,肯定true
  • 否则,我们可初步确定两个字符串的频次不一样或者它们拥有对方没有的字符
    • 字符种类的个数不一样可以,但是它们要满足具有相同频次,因为即使种类不一样,可以通过转换变为一样
class Solution {
public:
    int m1[26], m2[26];
    bool closeStrings(string& s, string& t) {
        int n=s.size(), m=t.size();
        if (n!=m) return false;
        unordered_set<char> s2;
        for (char c : s) m1[c-'a']++;
        for (char c : t) m2[c-'a']++, s2.insert(c);
        bool allEquals=true;
        for (int c=0; c<=25; c++) if (m1[c]!=m2[c]) {
            allEquals=false;
            break;
        }
        if (allEquals) return true;
        sort(m1,m1+26), sort(m2,m2+26);
        for (int c=0; c<=25; c++) if (m1[c] != m2[c]) return false;
        for (char c : s) if (s2.find(c)==s2.end()) return false;
        return true;
    }
};
posted @ 2020-11-15 11:37  童年の波鞋  阅读(103)  评论(0编辑  收藏  举报