LeetCode--859.亲密字符串(C++描述)

// Source : https://leetcode-cn.com/problems/buddy-strings/submissions/
// Date : 2022-1-12

/**************************************************************************************
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。

交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。

例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。

示例 1:

输入:s = “ab”, goal = “ba”
输出:true
解释:你可以交换 s[0] = ‘a’ 和 s[1] = ‘b’ 生成 “ba”,此时 s 和 goal 相等。
示例 2:

输入:s = “ab”, goal = “ab”
输出:false
解释:你只能交换 s[0] = ‘a’ 和 s[1] = ‘b’ 生成 “ba”,此时 s 和 goal 不相等。
示例 3:

输入:s = “aa”, goal = “aa”
输出:true
解释:你可以交换 s[0] = ‘a’ 和 s[1] = ‘a’ 生成 “aa”,此时 s 和 goal 相等。
示例 4:

输入:s = “aaaaaaabc”, goal = “aaaaaaacb”
输出:true

提示:

1 <= s.length, goal.length <= 2 * 104
s 和 goal 由小写英文字母组成

**************************************************************************************/

/*******************************************************************************************************
题目分析:首先统计字符串A,B中字符不匹配的下标;如果不匹配的下标个数不等于 0 或 2 时,不能由A得到B。如果不匹配的下标个数等于0时,A与B中字符完全相同,还需要A中有重复字符。最后,如果不匹配的下标个数等于2时,判断交换两对字符后是否匹配。
********************************************************************************************************/

// class Solution {
// public:
//     bool buddyStrings(string s, string goal) {
//         vector<int> flag;
//         //如果两者长度不相等那么肯定不符合题意
//         if(s.size() != goal.size())
//             return false;
//         else
//         {
//             for(int i = 0;i < s.size();++i)
//             {
//                 //记录出现不相等的位置
//                 if(s[i] != goal[i])
//                     flag.push_back(i);
//             }
//             //如果出现不相等的地方超过两处则不满足题意
//             if(flag.size() > 2)
//                 return false;
//             //如果两个单词位置都可以对的上
//             else if(flag.size() == 0)
//             {
//                 if(s == goal)
//                     return false;
//                 for(int i = 0;i < s.size() - 1;++i)
//                 {
//                     if(s[i] != s[i + 1])
//                         return false;
//                 }
//             }
//             else
//             {
//                 //否则交换前两个不相等位置上的字符之后判断二者是否相等
//                 swap(s[flag[0]], s[flag[1]]);
//             }
//         }
//         return (s == goal);
//     }
// };

// 统计字符串A,B中字符不匹配的下标。
// 不匹配的下标个数不等于 0 或 2 时,不能由A得到B。
// 不匹配的下标个数等于0时,A与B中字符完全相同,还需要A中有重复字符。
// 不匹配的下标个数等于2时,判断交换两对字符后是否匹配。


class Solution {
public:
    bool buddyStrings(const string& a, const string& b) {
        if (a.size() != b.size()) return false;
        vector<int> index_of_mismatch;
        for (int i = 0; i < a.size(); i++)
            if (a[i] != b[i]) {
                index_of_mismatch.push_back(i);
                if (2 < index_of_mismatch.size()) return false;
            }
        if (index_of_mismatch.size() == 0) {
            return set<char>(a.begin(), a.end()).size() < a.size();
        } else if (index_of_mismatch.size() == 2) {
            return a[index_of_mismatch[0]] == b[index_of_mismatch[1]] &&
                   a[index_of_mismatch[1]] == b[index_of_mismatch[0]];
        }
        return false;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值