0
点赞
收藏
分享

微信扫一扫

【搭建私有云盘】无公网IP,在外远程访问本地微力同步

楚木巽 2023-05-01 阅读 143

从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;
    }
}
举报

相关推荐

0 条评论