题目:
给你长度相等的两个字符串 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<int,pair<char,char>> 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<char,char> 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<char,char> a = hash[fir];
pair<char,char> 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就是想要获取的字符的下标,函数返回值为指定的字符。