news 2026/5/18 16:58:36

【困难】添加最少字符使字符串整体都是回文字符串-Java:原问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【困难】添加最少字符使字符串整体都是回文字符串-Java:原问题

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter

package live.every.day.ProgrammingDesign.CodingInterviewGuide.String; /** * 添加最少字符使字符串整体都是回文字符串 * * 【题目】 * 给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。 * * 【进阶题目】 * 给定一个字符串str,再给定str的最长回文子序列字符串strlps,请返回在添加字符最少的情况下,让str整体都是回文字符串的一 * 种结果。进阶问题比原问题多了一个参数,请做到时问复杂度比原问题的实现低。 * * 【难度】 * 困难 * * 【解答】 * 原问题。 * * 在求解原问题之前,我们先来解决下面这个问题,如果可以在str的任意位置添加字符,最少需要添几个字符可以让str整体都是回文 * 字符串。这个问题可以用动态规划的方法求解。如果str的长度为N,动态规划表是一个NxN的矩阵记为dp[][]。dp[i][j]值的含义 * 代表子串str[i..j]最少添加几个字符可以使str[i..j]整体都是回文串。那么,如何求dp[i][j]的值呢?有如下三种情况: * * 1.如果字符串str[i..j]只有一个字符,此时dp[i][j]=0,这是很明显的,如果str[i..j]只有一个字符,那么str[i..j]已经是 * 回文串了,自然不必添加任何宇符。 * 2.如果字符串str[i..j]只有两个字符。如果两个字符相等,那么dp[i][j]=0。如果两个字符不相等,那么dp[i][j]=1。 * 3.如果字符串str[i..j]多于两个字符。如果str[i]==str[j],那么dp[i][j]=dp[i+1][j-1]。如果str[i]!=str[j],要 * 让str[i..j]整体变为回文串有两种方法,一种方法是让str[i..j-1]先变成回文串,然后在左边加上字符str[j],就是 * str[i..j]整体变成回文串的结果。另一种方法是让str[i+1..j]先变成回文串,然后在右边加上字符str[i],就是str[i..j] * 整体变成回文串的结果。两种方法中哪个代价最小就选择哪个,即dp[i][j]=min{dp[i][j-1],dp[i+1][j]}+1。 * * 既然dp[i][j]值代表子串str[i..j]最少添加几个字符可以使str[i..j]整体都是回文串,所以根据上面的方法求出整个dp矩阵之 * 后,我们就得到了str中任何一个子串添加几个字符后可以变成回文串。具体请参看如下代码中的getDP方法。 * * 下面介绍如何根据dp短阵,求在添加字符最少的情况下,让str整体都是回文字符串的一种结果。首先,dp[0][N-1]的值代表整个字 * 符串最少需要添加几个字符,所以,如果最后的结果记为字符串res,res的长度=dp[0][N-1]+str的长度,然后依次设置res左右 * 两头的字符。具体过程如下: * * 1.如果str[i..j]中str[i]==str[j],那么str[i..j]变成回文串的最终结果=str[i]+str[i+1..j-1]变成回文串的结果 * +str[j],此时res左右两头的字符为str[i](也是str[j]),然后继续根据str[i+1..j-1]和矩阵dp来设置res的中间部分。 * 2.如果str[i..j]中str[i]!=str[j],看dp[i][j-1]和dp[i+1][j]哪个小。如果dp[i][j-1]更小,那么str[i..j]变成 * 回文串的最终结果=str[j]+str[i..j-1]变成回文串的结果+str[j],所以此时res左右两头的字符为str[j],然后继续根据 * str[i..j-1]和矩阵dp来设置res的中间部分。而如果dp[i+1][j]更小,那么str[i..j]变成回文串的最终结果= * str[i]+str[i+1..j]变成回文串的结果+str[i],所以此时res左右两头的字符为str[i],然后继续根据str[i+1..j]和矩阵 * dp来设置res的中间部分。如果一样大,任选一种设置方式都可以得出最终结果。 * 3.如果发现res所有的位置都已设置完毕,过程结束。 * * 原问题解法的全部过程请参看如下代码中的getPalindrome1方法。 * * 求解dp矩阵的时间复杂度为O(N^2),根据str和dp矩阵求解最终结果的过程为O(N),所以原问题解法中总的时间复杂度为O(N^2)。 * * @author Created by LiveEveryDay */ public class AddMinCharsMakePalindrome1 { public static int[][] getDP(char[] str) { int[][] dp = new int[str.length][str.length]; for (int j = 1; j < str.length; j++) { dp[j - 1][j] = str[j - 1] == str[j] ? 0 : 1; for (int i = j - 2; i > -1; i--) { if (str[i] == str[j]) { dp[i][j] = dp[i + 1][j - 1]; } else { dp[i][j] = Math.min(dp[i + 1][j], dp[i][j - 1]) + 1; } } } return dp; } public static String getPalindrome1(String str) { if (str == null || str.length() < 2) { return str; } char[] chas = str.toCharArray(); int[][] dp = getDP(chas); char[] res = new char[chas.length + dp[0][chas.length - 1]]; int i = 0; int j = chas.length - 1; int resl = 0; int resr = res.length - 1; while (i <= j) { if (chas[i] == chas[j]) { res[resl++] = chas[i++]; res[resr--] = chas[j--]; } else if (dp[i][j - 1] < dp[i + 1][j]) { res[resl++] = chas[j]; res[resr--] = chas[j--]; } else { res[resl++] = chas[i]; res[resr--] = chas[i++]; } } return String.valueOf(res); } public static void main(String[] args) { String str = "A1B21C"; System.out.printf("The palindrome is: %s", getPalindrome1(str)); } } // ------ Output ------ /* The palindrome is: AC1B2B1CA */
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 16:57:38

Pearcleaner:你的Mac终极清理管家,彻底解决磁盘空间困扰

Pearcleaner&#xff1a;你的Mac终极清理管家&#xff0c;彻底解决磁盘空间困扰 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经因为Mac存储空间不…

作者头像 李华
网站建设 2026/5/18 16:57:31

CSDN中Markdown文档的格式

CSDN中Markdown文档的格式 这里写自定义目录标题CSDN中Markdown文档的格式欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左…

作者头像 李华
网站建设 2026/5/18 16:50:09

【零基础部署】Docker + AnythingLLM 搭建私有知识库保姆级教程

你有没有想过,把公司内部文档、技术手册、学习笔记全部喂给一个 AI,让它变成一个「什么都知道」的私有知识助手?不用联网、不用担心数据泄露,所有信息都在你自己的服务器上。这就是 RAG(检索增强生成)技术的魅力。而 AnythingLLM 是目前最简单易用的私有知识库搭建方案之…

作者头像 李华
网站建设 2026/5/18 16:48:03

用C++和Eigen库手把手实现UR3机械臂逆解(附完整代码与避坑指南)

从理论到实践&#xff1a;基于Eigen库的UR3机械臂逆运动学完整实现指南 在工业自动化和机器人研究领域&#xff0c;六轴协作机械臂因其灵活性和广泛的应用场景而备受关注。UR3作为Universal Robots旗下的紧凑型协作机械臂&#xff0c;凭借其轻量化设计和用户友好特性&#xff0…

作者头像 李华
网站建设 2026/5/18 16:47:05

OBS实时字幕插件完整指南:3步为直播添加专业级字幕

OBS实时字幕插件完整指南&#xff1a;3步为直播添加专业级字幕 【免费下载链接】OBS-captions-plugin Closed Captioning OBS plugin using Google Speech Recognition 项目地址: https://gitcode.com/gh_mirrors/ob/OBS-captions-plugin 作为直播创作者&#xff0c;你是…

作者头像 李华
网站建设 2026/5/18 16:44:10

嵌入式面试总结:

嵌入式面试题项目:项目用了哪儿些功能:1、定时器&#xff1a;2、看门狗&#xff1a;3、ADC&#xff1a;4、DAC&#xff1a;5、SPI&#xff1a;6、IIC&#xff1a;7、IIS&#xff1a;8、串口&#xff1a;9、GPIO&#xff1a;11、emwin用的什么协助开发的12、PID&#xff1a;13、…

作者头像 李华