一、题目

对于某些非负整数 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 的字符串(难度:困难)相关推荐

  1. LeetCode 854 相似度为K的字符串

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

  2. 854. 相似度为 K 的字符串 BFS

    854. 相似度为 K 的字符串 字符串 s1 和 s2 是 k 相似 的(对于某些非负整数 k ),如果我们可以交换 s1 中两个字母的位置正好 k 次,使结果字符串等于 s2 . 给定两个字谜游戏 ...

  3. D22 LeetCode 440.字典序的第K小数字(困难)

    一.题目 二.思路(自己) 题目要求是字典序排列,即按照字符串比较一样进行排列,前几天刚好面过类似的题,为了降低时间复杂度,我们可以采用红黑树进行排序. 使用TreeSet来存储里面的数组,重写比较器 ...

  4. 图解LeetCode——623. 在二叉树中增加一行(难度:中等)

    一.题目 给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行. 注意,根节点 root 位于深度 1 . 加法规则如下: 给 ...

  5. 【手绘漫画】图解LeetCode之旋转链表(LeetCode 61题)

    文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题计划&qu ...

  6. 【手绘漫画】图解LeetCode之寻找重复数(LeetCode287题),抽屉原理

    文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 5.讨论 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题 ...

  7. LeetCode 974. 和可被 K 整除的子数组(哈希map)

    1. 题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满 ...

  8. LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)

    1. 题目 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1示例 2: ...

  9. 【手绘漫画】图解LeetCode之相交链表(LeetCode 160)

    文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题计划&qu ...

最新文章

  1. 云从科技完成B+轮超10亿元融资,多个国家基金进入
  2. Python3解题:二叉树路径总和问题
  3. python中如何标识语句块_如何用python在一个块中编写多个try语句?
  4. nginx listen
  5. IIS锁定是默认设置的 (overrideModeDefault=“Deny“)问题解决
  6. bum报文_Vxlan学习笔记——原理
  7. ubuntu命令行语法_Linux中重定向命令行的总结(ubuntu学习第三讲)
  8. display:none与visibility:hidden的区别 ,还有html5的新属性hidden
  9. 公司周刊-非常6+1—营销平台小组
  10. java infinite or nan,java.lang.NumberFormatException: Infinite or NaN(数学运算错
  11. ”记录集为只读“怎么解决?请高手帮忙看看。感激不尽……
  12. 互换性测量技术-几何误差
  13. 12.JAVA编程思想——集合的类型
  14. 动态站点:部署论坛系统Discuz!
  15. clang vectorization
  16. 实现动态输入关键字时关键字高亮
  17. 好用的Mac视频下载器:Allavsoft for Mac中文版
  18. 分享郑州买房后转LPR贷款利率带来的效益
  19. ssh mysql视屏_ssh+MySQL开发VOD视频点播系统
  20. [Visual Studio 2022 C#]使用SplitContainer拆分器让一个Windows窗口秒变多个

热门文章

  1. .net微信公众号或微信打开,静默授权,获取微信登录者的openid
  2. 【蓝桥杯每日一练:北斗七星数】
  3. 添加网络计算机名,windows10系统,更改计算机名后,网络中看不见自己的电脑了。...
  4. 神策面试官的修炼之道,选对人与吸引人 | 神策军
  5. Community Preserving Network Embedding 论文笔记
  6. 基于上下文的业务流建模法(三)
  7. 虚拟主机怎么用?香港虚拟主机搭建网站教程
  8. 程序员薪酬,未来的薪酬趋势
  9. 深信服python二面面什么_深信服 python开发 北京 笔试一面二面 面经
  10. 定额人工费调整差额的几个解决方案