今日份算法 — 859. 亲密字符串

更多算法实现见:https://github.com/Erindcl/Daily-algorithm

 

859. 亲密字符串

  • 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。

分析:出现亲密字符串的结果有两种:(1)第一种是两个字符串有且只有两个位置的字符不相同且并且交换两个位置的字符能使两字符串相同;(2)另一种情况是两个字符串完全相同并且字符串中存在至少有一个字符出现了两次的情况,此时交换这两个相同的字符也可使两字符串相同。

在代码中首先判断两字符串长度是否相同,长度不同无论怎么交换字符也不能使两字符串相等。接下来设置一个数组存放遍历字符串得到的两字符串不相等的字符索引。根据数组长度及内容判断两字符串是否为亲密字符串。当数组长度为0时,判断字符串中是否有相同字符元素,如果有则返回true,如果没有则返回false。当数组长度为2时,判断A[k]与[j]、A[j]与B[k]是否都相等,相等则返回true,不相等返回false。当数组长度为其余数的时候,都返回false。代码如下:

var buddyStrings = function(A, B) {
    let lenA = A.length, lenB = B.length, arr = [];
    if (lenA != lenB) {
        return false;
    }
    for (let i = 0; i < lenA; i++) {
        if (A[i] != B[i]) {
            arr.push(i);
        }
    }
    if (arr.length == 2) {
        let j = arr[0], k = arr[1];
        if (A[k] == B[j] && A[j] == B[k]) {
            return true;
        } else {
            return false;
        }
    } else if (arr.length == 0) {
        let temArr = new Set(A.split(""));
        if (temArr.size < lenA) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值