当前位置:   article > 正文

LeetCode5749. 邻位交换的最小次数(求原串到目标串通过交换相邻两个字符的最小交换次数)_给你一个表示大整数的字符串

给你一个表示大整数的字符串

题目描述:

给你一个表示大整数的字符串 num ,和一个整数 k 。

如果某个整数是 num 中各位数字的一个 排列 且它的 值大于 num ,则称这个整数为 妙数 。可能存在很多妙数,但是只需要关注 值最小 的那些。

例如,num = "5489355142" :
第 1 个最小妙数是 "5489355214"
第 2 个最小妙数是 "5489355241"
第 3 个最小妙数是 "5489355412"
第 4 个最小妙数是 "5489355421"
返回要得到第 k 个 最小妙数 需要对 num 执行的 相邻位数字交换的最小次数 。

测试用例是按存在第 k 个最小妙数而生成的。

 

示例 1:

输入:num = "5489355142", k = 4
输出:2
解释:第 4 个最小妙数是 "5489355421" ,要想得到这个数字:
- 交换下标 7 和下标 8 对应的位:"5489355142" -> "5489355412"
- 交换下标 8 和下标 9 对应的位:"5489355412" -> "5489355421"
示例 2:

输入:num = "11112", k = 4
输出:4
解释:第 4 个最小妙数是 "21111" ,要想得到这个数字:
- 交换下标 3 和下标 4 对应的位:"11112" -> "11121"
- 交换下标 2 和下标 3 对应的位:"11121" -> "11211"
- 交换下标 1 和下标 2 对应的位:"11211" -> "12111"
- 交换下标 0 和下标 1 对应的位:"12111" -> "21111"
示例 3:

输入:num = "00123", k = 1
输出:1
解释:第 1 个最小妙数是 "00132" ,要想得到这个数字:
- 交换下标 3 和下标 4 对应的位:"00123" -> "00132"
 

提示:

2 <= num.length <= 1000
1 <= k <= 1000
num 仅由数字组成

 

题解:首先C++STL中的next_permutation函数就是求比当前排列更大的下一个排列,所以第 k 个 最小妙数直接循环next_permutation 函数k次即可,主要是求原串到目标串通过交换相邻两个字符的最小交换次数

这里给出一种解法

  1. class Solution {
  2. public:
  3. int Ask(string a, string b) {
  4. int ans = 0;
  5. while (!a.empty()) {
  6. int pos = b.rfind(a.back());
  7. ans += ((int)b.size() - pos - 1);
  8. a.pop_back();
  9. b.erase(b.begin() + pos);
  10. }
  11. return ans;
  12. }
  13. int getMinSwaps(string num, int k) {
  14. string target(num);
  15. while (k--) {
  16. next_permutation(target.begin(), target.end());
  17. }
  18. return Ask(target, num);
  19. }
  20. };

其中求原串到目标串通过交换相邻两个字符的最小交换次数的模板

  1. int Ask(string a, string b) {
  2. int ans = 0;
  3. while (!a.empty()) {
  4. int pos = b.rfind(a.back());
  5. ans += ((int)b.size() - pos - 1);
  6. a.pop_back();
  7. b.erase(b.begin() + pos);
  8. }
  9. return ans;
  10. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/588077
推荐阅读
相关标签
  

闽ICP备14008679号