尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

DeepSeek LeetCode 3734. 大于目标字符串的最小字典序回文排列 TypeScript实现

DeepSeek    LeetCode 3734. 大于目标字符串的最小字典序回文排列 TypeScript实现
📅 发布时间:2026/7/27 8:11:00

```typescript
function lexPalindromicPermutation(s: string, target: string): string {
const n: number = s.length;
const half: number = Math.floor(n / 2);

// 统计字符频次
const cnt: number[] = new Array(26).fill(0);
for (const ch of s) {
cnt[ch.charCodeAt(0) - 97]++;
}

// 检查能否构成回文(奇数频次字符不能超过1个)
let oddChar: number = -1;
for (let i = 0; i < 26; i++) {
if (cnt[i] & 1) {
if (oddChar !== -1) return "";
oddChar = i;
}
}

// 左半部分可用字符数量(各取一半)
const leftCnt: number[] = cnt.map(c => Math.floor(c / 2));

// 构造完整回文串
const buildPalindrome = (left: number[], odd: number): string => {
const res: string[] = [];
// 左半部分
for (const c of left) {
res.push(String.fromCharCode(c + 97));
}
// 中间字符(若有)
if (odd !== -1) {
res.push(String.fromCharCode(odd + 97));
}
// 右半部分(左半部分反转)
for (let i = left.length - 1; i >= 0; i--) {
res.push(String.fromCharCode(left[i] + 97));
}
return res.join('');
};

// target 的左半部分(数字表示)
const targetLeft: number[] = target.slice(0, half).split('').map(ch => ch.charCodeAt(0) - 97);

// 第一步:尝试完全匹配 target 的左半部分
const left: number[] = new Array(half);
const remain: number[] = leftCnt.slice();
let ok: boolean = true;
for (let i = 0; i < half; i++) {
const c = targetLeft[i];
if (remain[c] > 0) {
left[i] = c;
remain[c]--;
} else {
ok = false;
break;
}
}
if (ok) {
const candidate = buildPalindrome(left, oddChar);
if (candidate > target) return candidate;
}

// 第二步:从右向左尝试修改某个位置
for (let pos = half - 1; pos >= 0; pos--) {
const remainCopy: number[] = leftCnt.slice();
const tempLeft: number[] = new Array(half);
let possible: boolean = true;

// 保持 pos 之前与 target 一致
for (let i = 0; i < pos; i++) {
const c = targetLeft[i];
if (remainCopy[c] > 0) {
tempLeft[i] = c;
remainCopy[c]--;
} else {
possible = false;
break;
}
}
if (!possible) continue;

// 在 pos 处放入比 target[pos] 大的最小字符
const targetC = targetLeft[pos];
let found = false;
for (let c = targetC + 1; c < 26; c++) {
if (remainCopy[c] > 0) {
tempLeft[pos] = c;
remainCopy[c]--;
found = true;
break;
}
}
if (!found) continue;

// pos 之后全部填最小字典序(从小到大)
for (let i = pos + 1; i < half; i++) {
for (let c = 0; c < 26; c++) {
if (remainCopy[c] > 0) {
tempLeft[i] = c;
remainCopy[c]--;
break;
}
}
}

const candidate = buildPalindrome(tempLeft, oddChar);
if (candidate > target) return candidate;
}

return "";
}
```

核心思路:
回文串由左半部分决定,因此构造左半部分即可。先尝试与 target 左半部分完全相同,若完整回文串大于 target 则直接返回;否则从右向左寻找第一个可以增大的位置,保持前面不变,该位置填入比原字符大的最小可用字符,之后用剩余字符的最小字典序填充,最后构造回文串并返回。

复杂度:时间 O(26·n) ≈ O(n),空间 O(n)。

相关新闻

  • 神经网络权重退化:原理、诊断与优化策略
  • LLM与对比学习加速罕见病基因诊断技术解析
  • LeetCode 1037题解:向量叉乘法判断三点共线

最新新闻

  • VMware 12虚拟机中启用Windows 7 Aero特效完整实战指南
  • 深度解析Evilginx配置文件:从MITM原理到自定义钓鱼模板实战
  • AI与编程技术如何提升短剧创作效率
  • 临沧精选口碑瓷砖空鼓维修公司推荐(2026)阳台墙砖脱空加固 - 北京优选
  • 1条慢SQL拖死5000并发?我用C# Polly V8 + 金仓内核“断尾参数“,把微服务雪崩的30秒假死压到0毫秒
  • jsoup 1.22.1升级解析:re2j引擎与JDK 25适配

日新闻

  • OpenClaw开源智能体网关:AI助手与即时通讯的完美融合
  • 写一个简单的sh脚本
  • 2026年 西安缝隙天线厂家:5G通信与车载天线专业定制供应商深度分析 - 卓企推荐

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号