图解LeetCode——854. 相似度为 K 的字符串(难度:困难)
一、题目
对于某些非负整数 k
,如果交换 s1
中两个字母的位置恰好 k
次,能够使结果字符串等于 s2
,则认为字符串 s1
和 s2
的 相似度为 k
。
给你两个字母异位词 s1
和 s2
,返回 s1
和 s2
的相似度 k
的最小值。
二、示例
2.1> 示例 1:
【输入】s1 = "ab", s2 = "ba"
【输出】1
2.2> 示例 2:
【输入】s1 = "abc", s2 = "bca"
【输出】2
提示:
1
<= s1.length <=20
- s2.length == s1.length
- s1 和 s2 只包含集合
{'a', 'b', 'c', 'd', 'e', 'f'}
中的小写字母 - s2 是 s1 的一个字母
异位词
三、解题思路
根据题目描述,需要寻找最小相似度,那么这道题我们可以采用回溯算法来进行计算。每次交换都会开辟一条新的“遍历路线”,那么每当我们走完一条路线之后,就需要通过回溯来走其他路线,最终根据计算每条路线的交换次数,返回最小值即可。下面我们以s1=“bccaba
”,s2=“abacba
”为例,展示一条路线的交换遍历过程,如下图所示:
通过上面的图例,我们了解到了一条路线的计算交换方式,但是,由于我们会针对每一步都会执行回溯操作(如果满足回溯条件的话),那么就会有N条路线。还是以上面的例子,如下列出了可能
路线很多,但是我们也没有必要全都执行完每条路线的遍历操作。比如,当我们遍历一条路线进行交换操作的时候,发现已经超过了其他路线的最小交换次数,那么这条路线我们就没有必要在继续走下去了。具体的逻辑处理,请参照如下的代码实现。
四、代码实现
class Solution {int result = Integer.MAX_VALUE;public int kSimilarity(String s1, String s2) {return execute(s1.toCharArray(), s2.toCharArray(), 0, 0);}public int execute(char[] sc1, char[] sc2, int start, int current) {if (current >= result) return result; // 如果交换次数已经超过"目前最小交换次数result",终止递归if (start == sc1.length - 1) return result = Math.min(current, result);for (int i = start; i < sc1.length; i++) {for (int j = i + 1; j < sc2.length; j++) {if (sc2[j] == sc1[i] && sc2[j] != sc1[j]) {swap(sc2, i, j); // 交换execute(sc1, sc2, i + 1, current + 1);swap(sc2, i, j); // 回溯 if (sc2[i] == sc1[j]) break; // 如果sc1和sc2的i位于j位互为相等,那么就是最优交换}}}return result = Math.min(current, result); }public void swap(char[] sc, int i, int j){char temp = sc[i];sc[i] = sc[j];sc[j] = temp;}
}
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」
图解LeetCode——854. 相似度为 K 的字符串(难度:困难)相关推荐
- LeetCode 854 相似度为K的字符串
题目描述 如果可以通过将 A 中的两个小写字母精确地交换位置 K 次得到与 B 相等的字符串,我们称字符串 A 和 B 的相似度为 K(K 为非负整数). 给定两个字母异位词 A 和 B ,返回 A ...
- 854. 相似度为 K 的字符串 BFS
854. 相似度为 K 的字符串 字符串 s1 和 s2 是 k 相似 的(对于某些非负整数 k ),如果我们可以交换 s1 中两个字母的位置正好 k 次,使结果字符串等于 s2 . 给定两个字谜游戏 ...
- D22 LeetCode 440.字典序的第K小数字(困难)
一.题目 二.思路(自己) 题目要求是字典序排列,即按照字符串比较一样进行排列,前几天刚好面过类似的题,为了降低时间复杂度,我们可以采用红黑树进行排序. 使用TreeSet来存储里面的数组,重写比较器 ...
- 图解LeetCode——623. 在二叉树中增加一行(难度:中等)
一.题目 给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行. 注意,根节点 root 位于深度 1 . 加法规则如下: 给 ...
- 【手绘漫画】图解LeetCode之旋转链表(LeetCode 61题)
文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题计划&qu ...
- 【手绘漫画】图解LeetCode之寻找重复数(LeetCode287题),抽屉原理
文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 5.讨论 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题 ...
- LeetCode 974. 和可被 K 整除的子数组(哈希map)
1. 题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满 ...
- LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)
1. 题目 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1示例 2: ...
- 【手绘漫画】图解LeetCode之相交链表(LeetCode 160)
文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题计划&qu ...
最新文章
- 云从科技完成B+轮超10亿元融资,多个国家基金进入
- Python3解题:二叉树路径总和问题
- python中如何标识语句块_如何用python在一个块中编写多个try语句?
- nginx listen
- IIS锁定是默认设置的 (overrideModeDefault=“Deny“)问题解决
- bum报文_Vxlan学习笔记——原理
- ubuntu命令行语法_Linux中重定向命令行的总结(ubuntu学习第三讲)
- display:none与visibility:hidden的区别 ,还有html5的新属性hidden
- 公司周刊-非常6+1—营销平台小组
- java infinite or nan,java.lang.NumberFormatException: Infinite or NaN(数学运算错
- ”记录集为只读“怎么解决?请高手帮忙看看。感激不尽……
- 互换性测量技术-几何误差
- 12.JAVA编程思想——集合的类型
- 动态站点:部署论坛系统Discuz!
- clang vectorization
- 实现动态输入关键字时关键字高亮
- 好用的Mac视频下载器:Allavsoft for Mac中文版
- 分享郑州买房后转LPR贷款利率带来的效益
- ssh mysql视屏_ssh+MySQL开发VOD视频点播系统
- [Visual Studio 2022 C#]使用SplitContainer拆分器让一个Windows窗口秒变多个
热门文章
- .net微信公众号或微信打开,静默授权,获取微信登录者的openid
- 【蓝桥杯每日一练:北斗七星数】
- 添加网络计算机名,windows10系统,更改计算机名后,网络中看不见自己的电脑了。...
- 神策面试官的修炼之道,选对人与吸引人 | 神策军
- Community Preserving Network Embedding 论文笔记
- 基于上下文的业务流建模法(三)
- 虚拟主机怎么用?香港虚拟主机搭建网站教程
- 程序员薪酬,未来的薪酬趋势
- 深信服python二面面什么_深信服 python开发 北京 笔试一面二面 面经
- 定额人工费调整差额的几个解决方案