欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > leetcode贪心(3106. 满足距离约束且字典序最小的字符串)

leetcode贪心(3106. 满足距离约束且字典序最小的字符串)

2024/10/24 3:22:26 来源:https://blog.csdn.net/acuteeagle01/article/details/140786118  浏览:    关键词:leetcode贪心(3106. 满足距离约束且字典序最小的字符串)

前言

经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。后续开始专项练习。

描述

给你一个字符串 s 和一个整数 k 。

定义函数 distance(s1, s2) ,用于衡量两个长度为 n 的字符串 s1 和 s2 之间的距离,即:

  • 字符 'a' 到 'z' 按 循环 顺序排列,对于区间 [0, n - 1] 中的 i ,计算所有「 s1[i] 和 s2[i] 之间 最小距离」的 和 

例如,distance("ab", "cd") == 4 ,且 distance("a", "z") == 1 。

你可以对字符串 s 执行 任意次 操作。在每次操作中,可以将 s 中的一个字母 改变  任意 其他小写英文字母。

返回一个字符串,表示在执行一些操作后你可以得到的 字典序最小 的字符串 t ,且满足 distance(s, t) <= k 。

示例 1:

输入:s = "zbbz", k = 3
输出:"aaaz"
解释:在这个例子中,可以执行以下操作:
将 s[0] 改为 'a' ,s 变为 "abbz" 。
将 s[1] 改为 'a' ,s 变为 "aabz" 。
将 s[2] 改为 'a' ,s 变为 "aaaz" 。
"zbbz" 和 "aaaz" 之间的距离等于 k = 3 。
可以证明 "aaaz" 是在任意次操作后能够得到的字典序最小的字符串。
因此,答案是 "aaaz" 。

示例 2:

输入:s = "xaxcd", k = 4
输出:"aawcd"
解释:在这个例子中,可以执行以下操作:
将 s[0] 改为 'a' ,s 变为 "aaxcd" 。
将 s[2] 改为 'w' ,s 变为 "aawcd" 。
"xaxcd" 和 "aawcd" 之间的距离等于 k = 4 。
可以证明 "aawcd" 是在任意次操作后能够得到的字典序最小的字符串。
因此,答案是 "aawcd" 。

示例 3:

输入:s = "lol", k = 0
输出:"lol"
解释:在这个例子中,k = 0,更改任何字符都会使得距离大于 0 。
因此,答案是 "lol" 。

提示:

  • 1 <= s.length <= 100
  • 0 <= k <= 2000
  • s 只包含小写英文字母。

实现原理与步骤

1.根据题干意思就是字符到'a'的距离小于k就替换为a,距离不够时移动到a最近的位置。
题干意思转换后思考应用的数据结构和算法时什么?
贪心+数组最为合适。
2. 一个字母移动到a的最短距离为Math.min(c-'a','z'-c+1);
3. 替换字母情况下将原字符串转换为字符数组,避免后续不必要的转换操作。
4. 字符串数组转换为字符串new String(ans);

代码实现

class Solution {public String getSmallestString(String s, int k) {char[] ans=s.toCharArray();for(int i=0;i<ans.length;i++){int distance=Math.min(ans[i]-'a','z'-ans[i]+1);if(distance<=k){ans[i]='a';k-=distance;}else{ans[i]-=k;break;}}return new String(ans);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com