字典序最小回文串

2023-11-07

在这里插入图片描述

字典序最小回文串

题目解读

给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换 s 中的一个字符。

请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操作次数的方案不止一种,则只需选取 字典序最小 的方案。

对于两个长度相同的字符串 a 和 b ,在 a 和 b 出现不同的第一个位置,如果该位置上 a 中对应字母比 b 中对应字母在字母表中出现顺序更早,则认为 a 的字典序比 b 的字典序要小。

返回最终的回文字符串。

示例 1:

输入:s = “egcfe”
输出:“efcfe”
解释:将 “egcfe” 变成回文字符串的最小操作次数为 1 ,修改 1 次得到的字典序最小回文字符串是 “efcfe”,只需将 ‘g’ 改为 ‘f’ 。

示例 2:

输入:s = “abcd”
输出:“abba”
解释:将 “abcd” 变成回文字符串的最小操作次数为 2 ,修改 2 次得到的字典序最小回文字符串是 “abba” 。

示例 3:

输入:s = “seven”
输出:“neven”
解释:将 “seven” 变成回文字符串的最小操作次数为 1 ,修改 1 次得到的字典序最小回文字符串是 “neven” 。

提示:

1 <= s.length <= 1000
s 仅由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lexicographically-smallest-palindrome

思路分析

要将字符串转变为回文串,并且字典序最小,可以使用双指针的方法进行操作:

  1. 初始化两个指针 left 和 right,分别指向字符串的开头和结尾。
  2. 当 left < right 时,进行循环:
    • 如果 s[left] != s[right],则需要进行替换操作。
    • 优先替换较大的字符为较小的字符,即将 s[right] 替换为 s[left]。
  3. 继续移动指针,left 向右移动一步,right 向左移动一步。
  4. 重复步骤2和步骤3,直到 left >= right。
  5. 返回经过操作后得到的回文串。

通过以上步骤,可以将给定的字符串转变为一个字典序最小的回文串。以下是具体的代码实现:

class Solution(object):
    def makeSmallestPalindrome(self, s):
        s = list(s)
        left, right = 0, len(s) - 1

        while left < right:
            if s[left] != s[right]:
                if s[right] < s[left]:
                    s[left] = s[right]
                else:
                    s[right] = s[left]
            left += 1
            right -= 1

        return ''.join(s)

使用上述代码对示例进行测试可以得到相应的结果。

image-20230701201852627

image-20230701201818197

算法解析

该解使用了贪心算法,通过双指针从字符串的两端向中间遍历。当左右指针指向的字符不相同时,根据题目要求选择将较小的字符赋值给较大的字符,以保证生成的回文串是字典序最小的。

贪心策略是一种求解最优化问题的常用算法思想,它在每一步都选择当前情况下看起来最优的选择,而不考虑未来可能发生的变化。贪心算法的核心思想是通过局部最优解的选择来达到全局最优解。

具体来说,贪心策略通常包括以下步骤:

  1. 定义问题的目标函数或者评价指标。
  2. 将问题分解成若干个子问题。每个子问题都应该是原问题的一个局部部分,并且该子问题的最优解能够推导出原问题的最优解。
  3. 通过贪心选择性质,确定每个子问题的最优选择。即在每一步中,根据局部最优解的选择准则,做出当前步骤的最优选择。
  4. 将局部最优解组合起来,得到原问题的解。

需要注意的是,贪心算法并不适用于所有的最优化问题。在某些情况下,它可能会得到次优解或者无法得到正确解。因此,在使用贪心算法时需要仔细分析问题的性质,确保贪心选择性质可以得到全局最优解。

总结起来,贪心策略是一种简单而高效的求解最优化问题的方法,它通过每一步的局部最优选择来达到全局最优解。

具体算法步骤如下:

  1. 将字符串转换为列表,方便修改字符。
  2. 初始化左右指针指向字符串的首尾字符。
  3. 当左指针小于右指针时,执行循环操作:
  • 如果左右指针指向的字符不相同,则根据字典序规则,将较小的字符赋值给较大的字符。
  1. 每次循环后,移动左指针向右,右指针向左,继续比较下一对字符。
  2. 循环结束后,返回将列表转换为字符串的结果。

该算法实现了尽可能少的操作,使原字符串变成一个回文串,并且保证了生成的回文串是字典序最小的。
循环后,移动左指针向右,右指针向左,继续比较下一对字符。
5. 循环结束后,返回将列表转换为字符串的结果。

该算法实现了尽可能少的操作,使原字符串变成一个回文串,并且保证了生成的回文串是字典序最小的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字典序最小回文串 的相关文章

随机推荐

  • [STM32] 关于USART接收中断的BUG和注意事项

    今天在使用USART模块 遇到了一些问题并解决了 于是发贴共享 问题描述 在使用USART做串口通讯时 我只把接收中断打开 并设置抢占优先级为最低一个级别 而接收中断上一个优先级处理事情比较多 可能占用了2ms时间 当我使用9600波特率往
  • 【Jupyter】【Colab】【AutoGluon】测试

    环境 pip install autogluon 测试代码 AutoGluon官网 from autogluon tabular import TabularDataset TabularPredictor train data Tabul
  • 第七章 缺失数据

    文章目录 一 缺失值的统计和删除 1 缺失信息的统计 2 缺失信息的删除 二 缺失值的填充和插值 1 利用fillna进行填充 练一练 END 2 插值函数 NOTE 关于polynomial和spline插值的注意事项 END 三 Nul
  • 用canvas画出可爱的哆啦A梦

    用canvas画出可爱的哆啦A梦 本文就介绍了如何用canvas案例画出哆啦A梦的基础内容 提示 以下是本篇文章正文内容 下面案例可供参考 一 canvas是什么 HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图
  • seata1.3.0 系列学习(二、nacos+seata使用)

    上篇文章讲了如何安装seata 这篇文章主要讲如何使用 分布讲解什么情况回滚 不回滚 一 新建父级maven pom xml文件导入
  • 数据结构-线性表(链表)(c++版)

    目录 1 单链表的基本概念与特点 2 单链表的特点 3 单链表的结构定义及其方法的实现 3 1 单链表结构的定义 3 2 方法的基本实现 3 3 单链表的插入删除操作讲解 3 4 单链表的删除算法 3 5 单链表的顺序访问与尾递归 3 6
  • c++ string 转 char * 出现乱码 内存共用问题

    系统 unbuntu16 04 IDE vscode 一 出现乱码 std string str Hello Word char p1 str c str 出现乱码 char p2 str data 出现乱码 二 出现内存共用 后面的字符串
  • C++的简单FTP客户端实现(二)编程

    基本FTP客户端 QT C 实现的FTP下载客户端 环境说明 FTP服务器 CentOS7 8 vsFTPD 3 0 2 安装设置见博文 CentOS vsftpd设置 客户端 win10 QT 5 15 2 实现的不是一个功能全的FTP客
  • H.264学习笔记3——帧间预测

    帧间预测主要包括运动估计 运动搜索方法 运动估计准则 亚像素插值和运动矢量估计 和运动补偿 对于H 264 是对16x16的亮度块和8x8的色度块进行帧间预测编码 A 树状结构分块 H 264的宏块 对于16x16的亮度宏块 可以分成16x
  • 【独立开发者er Cocos2d-x实战 011】Cocos2dx 3.x命令行生成APK详解

    Cocos2d x 3 6项目打包生成apk安卓应用文件 搭建安卓环境的步骤有点繁琐 但搭建一次之后 以后就会非常快捷 步骤如下 一 下载安卓环境 搭建Android环境需要用到Android SDK NDK Ant和JDK 下载Andro
  • linux中断处理详解

    与中断有关的数据结构 转载自 http edsionte com techblog archives 1539 1 概述 上文中我们通过一个简单的例子分析了一个中断程序的基本结构 可以看到 中断处理程序在处理中断时起到了关键作用 也是一个中
  • 【2023年电赛国一必备】D题报告模板--可直接使用

    任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 部分 摘要 本实验旨在设计和制作一种装置 用于对信号发生器输出的信号进行调制方式识别与参数估计 该装置能够识别和显示信
  • SpringCloud基础知识

    一 什么是微服务架构 微服务 一词源于Martin Fowler的名为Microservices 的博文 可以在他的官方博客上找到 简单地说 微服务是系统架构上的一种设计风格 它的主旨是将一个原本独立的系统拆分成多个小型服务 这些小型服务都
  • telnet远程登陆程序

  • 集合引用类型篇(一)

    ECMAScript中最常用的集合引用类型就是Object和Array 尤其是Array提供的很多方法 可以更方便的操纵数据 为我们提供快速处理数据的能力 Object 显示创建Object的实例对象有两种方法 一种是new Object
  • java开发——Cloneable接口、clone()方法和深浅拷贝

    1 实现Cloneable接口表明该类的对象是允许克隆的 2 允许克隆的意思是 可以调用clone 方法 3 深拷贝还是浅拷贝 取决于如何重写Object的clone 方法 4 原对象和克隆对象的关系 深拷贝 阳关道和独木桥 浅拷贝 藕断丝
  • java人脸识别功能实现

    1 首先是用的百度AI人脸识别接口 去百度申请以下参数作为预备 2 直接导入写好的人脸工具类对人脸进行注册 package cn abtu config import com baidu aip face AipFace import or
  • 基于Springboot+mysql+mybatis-plus+swagger+redis+rabbimq+Springcloud+eureka+feign(http)+Apollo的员工管理系统(1

    基于Springboot mysql mybatis plus swagger redis rabbimq Springcloud eureka feign http Apollo的员工管理系统 1 本系统基于Springboot集成各种组
  • SpringBoot+Kafka+ELK 完成海量日志收集

    整体流程大概如下 服务器准备 在这先列出各服务器节点 方便同学们在下文中对照节点查看相应内容 SpringBoot项目准备 引入log4j2替换SpringBoot默认log demo项目结构如下 pom
  • 字典序最小回文串

    字典序最小回文串 题目解读 给你一个由 小写英文字母 组成的字符串 s 你可以对其执行一些操作 在一步操作中 你可以用其他小写英文字母 替换 s 中的一个字符 请你执行 尽可能少的操作 使 s 变成一个 回文串 如果执行 最少 操作次数的方