给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
例子:
输入:s1 = "bank", s2 = "kanb"
输出:true
解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"
输入:s1 = "attack", s2 = "defend"
输出:false
解释:一次字符串交换无法使两个字符串相等
输入:s1 = "kelb", s2 = "kelb"
输出:true
解释:两个字符串已经相等,所以不需要进行字符串交换
输入:s1 = "abcd", s2 = "dcba"
输出:false
解题思路:
特殊情况先判断
1.两个字符串字符数不相等, 直接false返回
2.排序之后字符串不相等, 直接false返回
3.两个字符串相等直接返回true
循环判断
1.如果有2个差异, 差异字符不相等, 返回false
2.超过2个不相等, 返回false
代码:
未翻译版
func areAlmostEqual(_ s1: String, _ s2: String) -> Bool {
if s1.count != s2.count { return false }
if s1.sorted() != s2.sorted() { return false }
if s1 == s2 { return true }
var temp1 = s1, temp2 = s2, temp = "", sum = 0
while temp1.count > 0 {
if temp1.first != temp2.first && sum == 0 {
temp = String(temp1.first!) + String(temp2.first!)
sum += 1
}else if (temp1.first != temp2.first) && sum == 1 {
if String(temp2.first!) + String(temp1.first!) != temp {
return false
}
temp = ""
sum += 1
}else if sum > 2 {
return false
}
temp1.removeFirst()
temp2.removeFirst()
}
return temp == ""
}
翻译版
func areAlmostEqual(_ s1: String, _ s2: String) -> Bool {
// 两个字符串字符数不相等, 直接false返回
if s1.count != s2.count { return false }
// 排序之后字符串不相等, 直接false返回
if s1.sorted() != s2.sorted() { return false }
// 两个字符串相等直接返回true
if s1 == s2 { return true }
// 定义初始值
// temp1 = s1, temp2 = s2
// 循环i, 初始值i = 0, sum为差异计数值
// temp为差异字符串
var temp1 = s1, temp2 = s2, temp = "", sum = 0
// 循环
while temp1.count > 0 {
// 第一次不相等
if temp1.first != temp2.first && sum == 0 {
// temp为两者差异元素拼接之后形成的字符串
temp = String(temp1.first!) + String(temp2.first!)
// 差异计数 +1
sum += 1
// 第二次不相等
}else if (temp1.first != temp2.first) && sum == 1 {
// 两次差异字符串不相等, 直接false返回
if String(temp2.first!) + String(temp1.first!) != temp {
return false
}
// 两次相等temp设置成 ""
temp = ""
// 差异计数 +1
sum += 1
//超过2次不相等, 直接false返回
}else if sum > 2 {
return false
}
// temp1, temp2移出首字符继续循环
temp1.removeFirst()
temp2.removeFirst()
}
// 返回结果
return temp == ""
}
题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址