IOS 算法(基础篇) ----- 仅执行一次字符串交换能否使两个字符串相等

给你长度相等的两个字符串 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 算法合集地址

你可能感兴趣的:(IOS 算法(基础篇) ----- 仅执行一次字符串交换能否使两个字符串相等)