DeepSeek LeetCode 2663.字典序最小的的美丽字符串 Go实现
以下是 LeetCode 2663“字典序最小的美丽字符串”的 Go 实现。解题思路与 Java 版本一致1. 美丽字符串只包含前 k 个小写字母且不含长度大于 1 的回文子串2. 核心检查只需避免长度为 2 和 3 的回文3. 贪心策略从右向左找到第一个可增加的字符后面填充最小可行字符Go 代码gofunc smallestBeautifulString(s string, k int) string {arr : []byte(s)n : len(arr)// 从后往前尝试增加for i : n - 1; i 0; i-- {// 尝试当前位置的所有更大字符for c : arr[i] 1; c byte(ak); c {// 检查是否与前面的字符形成回文if i-1 0 c arr[i-1] {continue}if i-2 0 c arr[i-2] {continue}// 找到可行解arr[i] c// 填充 i 之后的字符为最小可行字符for j : i 1; j n; j {for d : byte(a); d byte(ak); d {if j-1 0 d arr[j-1] {continue}if j-2 0 d arr[j-2] {continue}arr[j] dbreak}}return string(arr)}}return }更简洁的版本使用辅助函数gofunc smallestBeautifulString(s string, k int) string {arr : []byte(s)n : len(arr)// 检查字符 c 放在位置 pos 是否合法isValid : func(pos int, c byte) bool {if pos-1 0 c arr[pos-1] {return false}if pos-2 0 c arr[pos-2] {return false}return true}// 从后往前尝试for i : n - 1; i 0; i-- {// 尝试更大的字符for c : arr[i] 1; c byte(ak); c {if !isValid(i, c) {continue}arr[i] c// 填充后面的位置for j : i 1; j n; j {for d : byte(a); d byte(ak); d {// 临时赋值以检查合法性old : arr[j]arr[j] dif isValid(j, d) {break}arr[j] old}}return string(arr)}}return }优化版本预计算填充gofunc smallestBeautifulString(s string, k int) string {arr : []byte(s)n : len(arr)// 从后往前查找可增加的位置for i : n - 1; i 0; i-- {// 尝试增加当前位置for c : arr[i] 1; c byte(ak); c {// 检查回文条件if (i 0 c arr[i-1]) || (i 1 c arr[i-2]) {continue}// 找到合法字符arr[i] c// 填充后续位置为最小字典序for j : i 1; j n; j {for d : byte(a); d byte(ak); d {if (j 0 d arr[j-1]) || (j 1 d arr[j-2]) {continue}arr[j] dbreak}}return string(arr)}}return }示例测试gofunc main() {fmt.Println(smallestBeautifulString(abcz, 26)) // abdabfmt.Println(smallestBeautifulString(dc, 4)) // fmt.Println(smallestBeautifulString(ab, 3)) // ac}算法复杂度· 时间复杂度O(n * k)其中 n 为字符串长度k 为字符集大小· 最坏情况需要尝试所有位置和所有字符· 空间复杂度O(n)存储字节数组关键点说明1. 回文检查简化· 只需检查与前 1 位避免 aa 形式· 只需检查与前 2 位避免 aba 形式· 因为任何长度 ≥4 的回文必然包含长度为 2 或 3 的回文2. 贪心正确性· 从后往前修改保证了字典序最小· 后面的位置填充最小可行字符进一步保证最小性3. 边界处理· 当 i 0 时只需检查与前 2 位不存在· 当 i 1 时只需检查与前 1 位