入门力扣自学笔记175 C++ (题目编号:1790)

1790. 仅执行一次字符串交换能否使两个字符串相等

题目:

给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。


示例 1:

输入:s1 = "bank", s2 = "kanb"
输出:true
解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"


示例 2:

输入:s1 = "attack", s2 = "defend"
输出:false
解释:一次字符串交换无法使两个字符串相等


示例 3:

输入:s1 = "kelb", s2 = "kelb"
输出:true
解释:两个字符串已经相等,所以不需要进行字符串交换


示例 4:

输入:s1 = "abcd", s2 = "dcba"
输出:false


提示:

1 <= s1.length, s2.length <= 100
s1.length == s2.length
s1 和 s2 仅由小写英文字母组成


来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/check-if-one-string-swap-can-make-strings-equal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路:

首先,我们建立一个哈希表,用于分别存储两个字符串中不同的字符对位置。

其次,我们对哈希表中不同字符进行交叉比对。

最后,如果交叉相等时则满足条件,为真,否则为假。


代码:

class Solution {
public:
    bool areAlmostEqual(string s1, string s2) {
        unordered_map> hash;
        int m = 0,n = s1.length();
        int fir,sec;
        for(int i = 0;i < n;i++)
        {
            if(s1.at(i) != s2.at(i))
            {
                pair temp = {s1.at(i),s2.at(i)};
                hash.insert({i,temp});
                m+=1;
                if(m == 1)
                    fir = i;
                if(m == 2)
                    sec = i;
                if(m > 2)
                    return false;
            }
        }
        pair a = hash[fir];
        pair b = hash[sec];
        if(a.first == b.second && a.second == b.first)
            return true;
        else
            return false;
    }
};

注:

1.pair函数

pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。

pair的实现是一个结构体,主要的两个成员变量是first,second。用于分别读取pair中的内容。

2.string.at()函数

string .at()用于获取指定字符。

at(i),i就是想要获取的字符的下标,函数返回值为指定的字符。

你可能感兴趣的:(力扣算法学习,leetcode,c++,算法)