🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
🚀 算法题 🚀 |
🚩 题目链接
⛲ 题目描述
给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以完成以下行为:
- 选择 s 的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前一个字符。例如,‘b’ 用 ‘a’ 替换,‘a’ 用 ‘z’ 替换。
返回执行上述操作 恰好一次 后可以获得的 字典序最小 的字符串。
子字符串 是字符串中的一个连续字符序列。
现有长度相同的两个字符串 x 和 字符串 y ,在满足 x[i] != y[i] 的第一个位置 i 上,如果 x[i] 在字母表中先于 y[i] 出现,则认为字符串 x 比字符串 y 字典序更小 。
示例 1:
输入:s = “cbabc”
输出:“baabc”
解释:我们选择从下标 0 开始、到下标 1 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
示例 2:
输入:s = “acbbc”
输出:“abaab”
解释:我们选择从下标 1 开始、到下标 4 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
示例 3:
输入:s = “leetcode”
输出:“kddsbncd”
解释:我们选择整个字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
提示:
1 <= s.length <= 3 * 105
s 仅由小写英文字母组成
🌟 求解思路&实现代码&运行结果
⚡ 贪心
🥦 求解思路
- 题目让我们找到替换后最小的字典序,每次替换的规则都是
字符串中的每一个字符替换为英文字母表中的前一个字符
,所以,我们是不能让a 替换为z的,由此,我们以a为突破点,只要当前的字符大于a,就替换为前一个字符,直接结束。 - 需要特殊考虑的一种情况是,如果给定的字符串都是aaa…的情况,由于题目需要我们必须替换一次,为了使得最终的字符串字典序最小,直接将最后一个字符替换为z即可。
- 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
class Solution {
public String smallestString(String s) {
int n = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < n; i++) {
if (arr[i] > 'a') {
while (i < n && arr[i] > 'a') {
arr[i++]--;
}
return new String(arr);
}
}
arr[n - 1] = 'z';
return new String(arr);
}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |