news 2026/5/26 5:34:38

DeepSeek LeetCode 2663.字典序最小的的美丽字符串 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 2663.字典序最小的的美丽字符串 Java实现

以下是 LeetCode 2663“字典序最小的美丽字符串”的 Java 实现。

解题思路

1. 理解“美丽字符串”:
· 长度为 n
· 只包含前 k 个小写字母
· 不包含任何长度大于 1 的回文子串
· 实际上只需检查长度为 2 和 3 的回文(因为更长回文一定包含短回文)
2. 核心要求:
· 找到字典序 大于 s 的最小美丽字符串
· 如果不存在返回空字符串
3. 贪心 + 回溯:
· 从字符串末尾开始尝试增加字符
· 每次增加后检查是否与前面 1 位或 2 位形成回文
· 如果冲突则继续增加,如果无法增加则回退到前一位

Java 代码

```java
class Solution {
public String smallestBeautifulString(String s, int k) {
char[] chars = s.toCharArray();
int n = chars.length;

// 从末尾开始尝试
for (int i = n - 1; i >= 0; i--) {
// 尝试将当前位置字符增加
for (char c = (char)(chars[i] + 1); c < 'a' + k; c++) {
// 检查是否与前面形成回文
if (i > 0 && c == chars[i - 1]) continue;
if (i > 1 && c == chars[i - 2]) continue;

// 找到可行字符
chars[i] = c;
// 将后面的字符填充为最小可行字符
for (int j = i + 1; j < n; j++) {
for (char d = 'a'; d < 'a' + k; d++) {
if (j > 0 && d == chars[j - 1]) continue;
if (j > 1 && d == chars[j - 2]) continue;
chars[j] = d;
break;
}
}
return new String(chars);
}
}

return "";
}
}
```

算法说明

1. 回文检查:
· 只需要检查与前 1 位(长度为 2 的回文)
· 和与前 2 位(长度为 3 的回文)
· 因为更长的回文一定包含这两个中的某一个
2. 贪心策略:
· 从右向左找到第一个可以增加的字符位置
· 将其增加为满足条件的最小字符
· 后续位置全部填充为最小可行字符
3. 字符集限制:
· 只能使用 'a' 到 'a' + k - 1 的字符

示例演示

```java
// 示例 1
s = "abcz", k = 26
// 从末尾 'z' 无法增加
// 前一位 'c' 增加到 'd',后面填充 'a','b'...
// 结果: "abdab"

// 示例 2
s = "dc", k = 4 // 字符集 {a,b,c,d}
// 从末尾 'c' 无法增加(只能到 'd',但 'd' 与前一位 'd' 形成回文 "dd")
// 前一位 'd' 无法增加(超出字符集)
// 返回 ""
```

复杂度分析

· 时间复杂度:O(n * k),最坏情况需要尝试每个位置的所有字符
· 空间复杂度:O(n),存储字符数组

优化版本(更清晰的实现)

```java
class Solution {
public String smallestBeautifulString(String s, int k) {
char[] arr = s.toCharArray();
int n = arr.length;

// 从后往前尝试增加
for (int i = n - 1; i >= 0; i--) {
// 尝试当前位置的所有更大字符
for (char ch = (char)(arr[i] + 1); ch < 'a' + k; ch++) {
// 检查是否与前面的字符形成回文
if (i - 1 >= 0 && ch == arr[i - 1]) continue;
if (i - 2 >= 0 && ch == arr[i - 2]) continue;

// 找到可行解,构造后续字符
arr[i] = ch;
// 填充 i 之后的字符
for (int j = i + 1; j < n; j++) {
for (char c = 'a'; c < 'a' + k; c++) {
if (j - 1 >= 0 && c == arr[j - 1]) continue;
if (j - 2 >= 0 && c == arr[j - 2]) continue;
arr[j] = c;
break;
}
}
return new String(arr);
}
}
return "";
}
}
```

这个解法通过贪心 + 回溯,确保找到字典序最小的美丽字符串。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 5:33:35

告别硬件IIC:用STM32F407的GPIO模拟IIC读写AT24C02 EEPROM实战

STM32F407模拟IIC驱动AT24C02全解析&#xff1a;从硬件缺陷到软件突围在嵌入式开发中&#xff0c;IIC总线因其简单的两线制结构&#xff08;SCL时钟线和SDA数据线&#xff09;被广泛应用于各类低速外设通信。然而许多STM32开发者都遭遇过这样的困境&#xff1a;硬件IIC模块在实…

作者头像 李华
网站建设 2026/5/26 5:33:34

手写Excel摊销表:从PMT到PPMT的金融函数精解与精度控制

1. 为什么我坚持手写一张Excel摊销表&#xff0c;而不是用现成模板或在线计算器刚入行做财务分析那会儿&#xff0c;我总以为“能跑通就行”——找一个网上下载的摊销模板&#xff0c;改几个数字&#xff0c;导出PDF交差。直到有次给客户做房贷优化方案&#xff0c;对方指着我表…

作者头像 李华
网站建设 2026/5/26 5:29:36

Excel与Tableau高效协同:从数据清洗到动态看板实战指南

1. 为什么你手里的Excel表格&#xff0c;总在关键时刻“卡住”了&#xff1f;Excel用得再熟&#xff0c;也逃不过那个熟悉的窒息时刻&#xff1a;报表改到第17版&#xff0c;老板突然问“上季度华东区环比增长多少&#xff1f;能不能按产品线拆开看&#xff1f;”——你手指悬在…

作者头像 李华
网站建设 2026/5/26 5:28:21

如何将影像组学与病理组学特征与胃癌术后复发的“炎症‑耗竭”免疫机制建立关联,并解释其与患者预后及辅助化疗/免疫治疗响应的机制联系

01导语近年来&#xff0c;影像组学&#xff08;Radiomics&#xff09;已经从“单纯做预测模型”的阶段&#xff0c;逐渐进入“强调生物学解释与机制验证”的新阶段。过去&#xff0c;大量影像组学研究往往停留在“特征提取—模型构建—AUC展示”的技术路径上&#xff0c;虽然能…

作者头像 李华