讲师中心 微信公众号
AI工具推荐 视频效率加速

如何构造使总误差最小的字典序最小子回文串

老萱小哥_7467

老萱小哥_7467

发布时间:2026-11-05 08:56:21

|

975人浏览过

|

来源于php中文网

原创

如何构造使总误差最小的字典序最小子回文串

给定等长字符串数组,需构造一个长度相同的回文串,使其与所有输入串的字符绝对距离之和最小;当存在多个最优解时,返回字典序最小者。核心在于:回文串第 i 位与第 m−1−i 位必须相同,而该最优字符应取所有字符串在位置 i 和对称位置上的字符的加权中位数。

给定等长字符串数组,需构造一个长度相同的回文串,使其与所有输入串的字符绝对距离之和最小;当存在多个最优解时,返回字典序最小者。核心在于:回文串第 i 位与第 m−1−i 位必须相同,而该最优字符应取所有字符串在位置 i 和对称位置上的字符的加权中位数。

要解决「构造最小误差回文串」问题,关键在于理解误差函数的可分离性与回文约束的耦合关系。

误差可分离性:总误差 = Σi=0m−1 Σk=0n−1 |sk[i] − α[i]|。由于绝对值函数是凸函数,且各位置相互独立,因此每个位置 i 的最优字符选择互不影响——但注意:回文约束强制 α[i] == α[m−1−i],故位置 i 与位置 m−1−i 实际共享同一决策变量。

合并对称位置:对每个 i ∈ [0, ⌊(m−1)/2⌋],我们需共同决定 α[i](同时决定 α[m−1−i])。此时,该字符将参与计算所有字符串在位置 i 和位置 m−1−i 上的误差贡献。即:

总误差中与 α[i] 相关的部分 = Σk (|sk[i] − c| + |sk[m−1−i] − c|),其中 c ∈ ['a', 'z']。

该表达式是关于 c 的分段线性凸函数,其最小值在所有 2n 个字符(含重复)的中位数处取得。由于字符集离散且有序('a'=0, ..., 'z'=25),我们可统计频次后线性扫描求中位数索引。

字典序最小保证:中位数可能不唯一(例如偶数个元素时,任意介于两个中间值之间的数都最小化绝对偏差和)。但题目要求字典序最小解,因此我们应选择满足最小误差条件的最小字符。幸运的是,上述频次累加求中位数的过程天然返回最小可行中位数下标(因从 'a' 开始累加计数,首次使累计频次 ≥ n 即停止),恰好满足字典序要求。

以下是完整实现(含边界处理):

static String solve(List<String> list) {
    int n = list.size();
    int m = list.get(0).length();
    StringBuilder sb = new StringBuilder();

    // 只需确定前半部分(含中心,当 m 为奇数时)
    int mid = (m + 1) / 2;

    for (int i = 0; i < mid; i++) {
        int j = m - 1 - i; // 对称位置
        int[] freq = new int[26];

        // 统计所有字符串在位置 i 和 j 的字符频次
        for (String s : list) {
            freq[s.charAt(i) - 'a']++;
            if (i != j) { // 避免中心位重复计数(m 为奇数时 i == j)
                freq[s.charAt(j) - 'a']++;
            }
        }

        // 求中位数:找最小 c 使得累计频次 >= n(注意:共 2n 个字符,中位数定义为第 n 小元素)
        int total = 0;
        int medianIdx = 0;
        for (; medianIdx < 26; medianIdx++) {
            total += freq[medianIdx];
            if (total >= n) break; // 第 n 小元素落在该字符上(因共 2n 个样本,中位区间为第 n & n+1 个,取小者保字典序)
        }
        sb.append((char)('a' + medianIdx));
    }

    // 构建完整回文:前半部分 + 反转后的前半部分(跳过中心字符)
    String half = sb.toString();
    String rightHalf = new StringBuilder(half).reverse().substring(m % 2);
    return half + rightHalf;
}

注意事项:

  • 时间复杂度:O(n × m + 26 × m/2) = O(n × m),满足约束 n × m ≤ 2×10⁵;
  • 空间复杂度:O(1) 额外空间(固定大小频次数组);
  • 正确处理奇偶长度:当 m 为奇数时,中心位 i == j,只统计一次;substring(m % 2) 自动跳过中心字符以避免重复;
  • 严格满足“字典序最小”:因中位数扫描从 'a' 开始,首个达标字符即为所求。

该解法摒弃暴力枚举,基于数学优化(L1 中位数性质)与回文对称性,兼具高效性与正确性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

0

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

0

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架零基础入门教程
XORM框架零基础入门教程

本专题梳理XORM框架的入门路径,从框架定位、依赖安装、连接数据库到跑通第一个增删改查示例,讲清Engine初始化、日志开启与项目目录规划,并对比GORM等同类ORM的差异,帮助Go开发者建立整体认知。

0

2026.11.04

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

20

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn