LeetCode 854 相似度为K的字符串

本文介绍了一个算法问题,即计算两个字符串的相似度K,通过最少的字符交换次数使两个字符串相等。使用广度优先搜索(BFS)解决该问题,并提供了详细的代码实现。

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

题目描述
如果可以通过将 A 中的两个小写字母精确地交换位置 K 次得到与 B 相等的字符串,我们称字符串 A 和 B 的相似度为 K(K 为非负整数)。
给定两个字母异位词 A 和 B ,返回 A 和 B 的相似度 K 的最小值。

  • 输入:A = “ab”, B = “ba”
    输出:1
  • 输入:A = “ab”, B = “ba”
    输出:1
  • 输入:A = “abac”, B = “baca”
    输出:2
  • 输入:A = “aabc”, B = “abca”
    输出:2
  • 提示:
    1 <= A.length == B.length <= 20
    A 和 B 只包含集合 {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’} 中的小写字母。
    这个题不做过多解释了,因为太晚了~~~
    采用BFS,详情请看代码
class Solution {
    public int kSimilarity(String A, String B) {
        int i = 0;
        int len = B.length();
        for(i = 0;i<A.length();i++){
            if(A.charAt(i)!=B.charAt(i))
                break;
        }//找出第一个不相符的位置
        Queue<Pair> queue = new LinkedList<Pair>();
        queue.offer(new Pair(A,i));
        Set<String> set = new HashSet<>();
        set.add(A);
        int res = 0;
        while(!queue.isEmpty()){
            int n = queue.size();
            for(int k = 0;k<n;k++){//遍历第res次交换后的字符串
                int index = queue.peek().f;
                String str = queue.peek().s;
                queue.poll();
                if(str.equals(B))
                    return res;
                while(index<len&&str.charAt(index)==B.charAt(index))
                    index++;
                /*if(index==len)
                    return res;*/
                for(int j = index+1;j<len;j++){//对每一个字符串的子字符串入队操作
                    if(str.charAt(j)==B.charAt(index)&&str.charAt(j)!=B.charAt(j)){
                        str = swap(str,index,j);
                        if(!set.contains(str)){
                            queue.offer(new Pair(str,index+1));
                            set.add(str);
                        }
                        str = swap(str,index,j);
                    }
                }
            }
            res++;
        }
        return res;
    }
    public String swap(String m,int a,int b){
        StringBuilder sb = new StringBuilder();
        sb.append(m.substring(0,a)).append(m.substring(b,b+1)).append(m.substring(a+1,b)).append(m.substring(a,a+1)).append(m.substring(b+1));
        return sb.toString();

    }
    class Pair{
        String s;
        int f;
        public Pair(String t,int d){
            s = t;
            f = d;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值