Leetcode力扣秋招刷题路-0854

该文章介绍了一种计算字符串s1和s2最小相似度k的方法,通过比较字符并进行不超过k次的交换来实现。提供的Java代码实现了一个递归算法,从字符串的左侧开始,遇到不匹配的字符时,在另一字符串中寻找并交换,更新交换次数并继续比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

854. 相似度为 K 的字符串

对于某些非负整数 k ,如果交换 s1 中两个字母的位置恰好 k 次,能够使结果字符串等于 s2 ,则认为字符串 s1 和 s2 的 相似度为 k 。

给你两个字母异位词 s1 和 s2 ,返回 s1 和 s2 的相似度 k 的最小值。

示例 1:
输入:s1 = “ab”, s2 = “ba”
输出:1

示例 2:
输入:s1 = “abc”, s2 = “bca”
输出:2

提示:
1 <= s1.length <= 20
s2.length == s1.length
s1 和 s2 只包含集合 {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’} 中的小写字母
s2 是 s1 的一个字母异位词

思路:从最左边的i=0位置开始,对比A和B的字符,如果当前位置i的字符不相等,就在B中后面字符i+1及后面位置中找和当前A中i位置相等的字符,找到后就进行交换位置,然后递归进去从i+1的位置开始直到最末尾位置时记录当前交换次数,具体看代码,非常直观

class Solution {
    int minCount = Integer.MAX_VALUE;
    public int kSimilarity(String A, String B) {
        int len = A.length();

        char[] recordA = new char[len];
        char[] recordB = new char[len];

        for (int i = 0; i < len; i++){
            recordA[i] = A.charAt(i);
            recordB[i] = B.charAt(i);
        }

        doSelect(recordA, recordB, len, 0, 0);

        return minCount;
    }

    private void doSelect(char[] recordA, char[] recordB, int len, int curCount, int curIndex){
        if (curCount > minCount) return; // 当前次数已经超过当前最小次数,则直接返回不必要进行递归了

        if (curIndex == len - 1){
            if (curCount < minCount) minCount = curCount;
            return;
        }

        int i = curIndex;
        for (; i < len; i++){
            if (recordA[i] == recordB[i]) continue; // 当前的元素相等的话,就直接遍历下一个

            // 不相等,进行从recordB后续的字符中找与当前A中相等的字符进行替换
            char aCurChar = recordA[i];
            int k = i + 1;
            for (; k < len; k++){
                if (aCurChar == recordB[k]){ // 找到其中一个与aCurChar相等的字符,则进行位置交换
                    swap(recordB, i, k);
                    doSelect(recordA, recordB, len, curCount + 1, i + 1);
                    swap(recordB, i, k); // 替换回来
                }
            }
            return;
        }

        if (i == len){
            if (curCount < minCount) minCount = curCount;
        }
    }

    private void swap(char[] arr, int i, int j){
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fffffffyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值