5.13 添加最少字符使字符串整体都是回文字符串

题目】:

  给定一个字符串str,如果可以在str的任意位置添加字符,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果

  举例:

    str="ABA",str本身就是回文串,不需要添加字符,所以返回"ABA"

    str="AB",可以在‘A‘之前添加‘B‘,使str整体都是回文串,故可以返回"BAB",也可以在‘B‘之后添加‘A‘,使str整体都是回文串,故也可以返回"ABA",总之,只要添加的字符数最少,只返回其中一种结果即可

进阶题目】:

  给定一个字符串str,再给定str的最长回文子序列字符串strlps,请返回在添加字符最少的情况下,让str整体都是回文字符串的一种结果。进阶问题比原问题多了一个参数,请做到时间复杂度比原问题的实现低

  举例:

    str="A1B21C",strlps="121",返回"AC1B2B1CA"或者"CA1B2B1AC",总之,只要是添加的字符数最少,只返回其中一种结果即可

题目来源:左程云老师《程序员代码面试指南》

原文地址:https://www.cnblogs.com/latup/p/10149467.html

时间: 2024-09-30 21:11:22

5.13 添加最少字符使字符串整体都是回文字符串的相关文章

C++求一个字符串中的所有回文字符串并且输出结果(字符串操作)

#include <iostream> #include <string.h> using namespace std; bool check(char *str)//判断这是不是一个回文字符串. { int i = 0; int j = strlen(str)-1; while(i<j) { if(*(str+i)!=*(str+j)) return false; i++; j--; } return true; } void get_str(char *str) { in

hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31611    Accepted Submission(s): 11618 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

680. Valid Palindrome II【Easy】【双指针-可以删除一个字符,判断是否能构成回文字符串】

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome. Example 1: Input: "aba" Output: True Example 2: Input: "abca" Output: True Explanation: You could delete the character 'c'. N

关于回文字符串

1 提取一个字符串中的所有回文字符串 我目前的思路是循环遍历,第i个和0-i-1个如果a[i]=a[j],则判断i-j之间是不是回文,0-j之间的字符每个是一个回文字符串 2 找出一个字符串中的最长的回文字符串 先找出a[i-1]=a[i+1]或者a[i]=a[i+1]这样的数,然后像两边扩展,记录下长度和位置,直到遍历完所有的字符串,然后找出长度最大的 3给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来

判断一个数是否为回文数,字符串是否为回文字符串

使用C语言编写程序 判断一个数是否为回文数.(ps:回文数也是一个数字,数字的特点是正反序是同一个数字,如12321,3443就是回文数). 要判断该数字是否为回文数,可以通过模除得到该数的反序数字,进行比较是否相等来判读. 具体实现如下: void Practice() { int num, value, flag, var; value = 0; flag = 1; scanf("%d", &num); var = num; while(num) {//value存储num

Leetcode 680.验证回文字符串

验证回文字符串 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: True 解释: 你可以删除c字符. 注意: 字符串只包含从 a-z 的小写字母.字符串的最大长度是50000. 1 class Solution { 2 public boolean isPalindromeRange(String s, int i, int j) { 3 for (in

求取最长回文字符串,o(n)的最优算法manacher

算法的第一步就是在每个字符的左右都加上一个#,这样有什么效果呢. 比如aba初始化之后为#a#b#a#,字符串长度为7是奇数. 比如1221初始化之后为#1#2#2#1#,字符串长度为9是奇数. 为什么我们要将其转换成奇数呢,因为算法求取回文串长度的时候,需要有一个中心节点,之后分别向左右搜索,所以需要将回文串豆转换为奇数长度. 之后我们需要将str[0]赋值为一个字符,可以赋值为$,不这样做也可以,但是这样做我们就可以从1开始处理字符串,大家知道C++的数组是从0开始的. 算法的第二步就进入了

双指针---回文字符串

回文字符串 680. Valid Palindrome II (Easy) Input: "abca" Output: True Explanation: You could delete the character 'c'. 题目描述: ??可以删除一个字符,判断是否能够构成回文字符串. 代码: public boolean validPalindrome(String s){ int i==-1; int j=s.length(); while(++i<--j){ if(s.

Leetcode-680(回文字符串)

1.题目 可以删除一个字符,判断是否能构成回文字符串.: Input: "abca" Output: True Explanation: You could delete the character 'c'. 2.代码实现: class Solution(object): def validPalindrome(self, s): """ :type s: str :rtype: bool """ p1, p2 = 0, le