给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

思路:回文串的特点是,逆序输出和正序输出是一样的。所以这道题可以从这方面来考虑。如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数。

求LCS的方法可以在csdn中找到。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
            String str = scan.nextLine();
            System.out.println(str.length()-getResult(str));
        }
    }
    public static int getResult(String str){
        StringBuilder sb  = new StringBuilder(str);
        String newStr = sb.reverse().toString();
        char[] c1 = str.toCharArray();
        char[] c2 = newStr.toCharArray();
        int n = str.length();
        int[][] dp = new int[n+1][n+1];
        for(int i=1;i<n+1;i++){
            for(int j=1;j<n+1;j++){
                if(c1[i-1]==c2[j-1]){ //此处应该减1.
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[n][n];
    }
}
时间: 2024-12-24 02:48:28

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。的相关文章

回文指的是一个字符串从前面读和从后面读都一 样,编写一个算法判断一个字符串是否为回文。

回文指的是一个字符串从前面读和从后面读都一 样,编写一个算法判断一个字符串是否为回文. 要求: 1)采用链栈实现算法: 2)从键盘输入一个字符串,输出判断结果. #include"stdio.h" #include"stdlib.h" typedef char ElemType; typedef struct stnode { ElemType data; struct stnode *next; }StNode, *LinkStack; int huiwen(ch

求得到一个字符串@“absdfasdfsdfdsafsd....”所有的排列

//得到一个字符串@“absdfasdfsdfdsafsd....”所有的排列 length!/((相同项)!*(相同项)!) -(int )numberOfstring:(NSString*)str // NSString *str [email protected]"adfsadfasdfasdfsadfsdaxfgghfgjtyy"; int sumlength = str.length;//所有字符的个数 NSString *mystr = @"abcdefghijk

构造回文 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数. 输入例子: abcda google 输出例子: 2 2 给出c++代码: #include <iostream>#include <string>#include <algorithm>using namespace std;int LCS(const string &str1,con

JavaScript面试题:重复输出一个给定的字符串

面试题 重复输出一个给定的字符串(str第一个参数)n 次 (num第二个参数),如果第二个参数num不是正数的时候,返回空字符串. function repeatStringNumTimes(str, num) { return str; } repeatStringNumTimes("abc", 3); 提供测试情况: repeatStringNumTimes("*", 3) //应该返回 "***". repeatStringNumTime

022给定一个字符串类型(string)表示的小数,打印出它的二进制表示(keep it up)

给定一个字符串类型(string)表示的小数,打印出它的二进制表示. 这个题注意字符串的合法性. 不过下面的代码没有处理那种无限循环的小数, 当出现无限循环小数时,while(other>0)可能永久为true 代码: #include <iostream> #include <string> std::string to_binary_string(const std::string& vNumStr) { std::string::size_type Pos =

给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1。

1. 给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1. sample: 输入:"abcdefcba" 输出:3 解法:先遍历字符串,用一个map记录每个字符出现的次数,再次遍历字符串,找到第一个只出现一次的字符,复杂度为O(n). #include <iostream> #include <string> #include <cstring> #include <map> using namespace std; int

给定一个字符串类型表示的小数,输出其二进制表示

题目 给定一个字符串类型(string)表示的小数,打印出它的二进制表示. 如果这个数无法精确地表示为二进制形式,输出”ERROR”. 解答 整数部分通过不断地对2取余然后除以2来得到其二进制表示, 或是不断地和1按位与然后除以2得到其二进制表示. 小数部分则通过不断地乘以2然后与1比较来得到其二进制表示. 小数部分转化为二进制,通过乘以2然后与1比较,大于等于1则该位为1,并且该值减去1: 否则该位为0.不断地通过这种操作最终能使该小数部分的值变为0的,即可精确表示. 否则将无法用有限的位数来

删除一个字符串中连续超过一次的空格

问题 删除一个字符串中连续超过一次的空格. 解决(Python) #! /usr/bin/env python #coding:utf-8 def del_space(string): split_string = string.split(" ") #以空格为分割,生成list,list中如果含有空格,则该空格是连续空格中的后一个 string_list = [i for i in split_string if i!=""] #去掉空格,生成list resul

【剑指offer】删除在另一个字符串中出现的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.如何判断那些字符是需要删除的字符.同很多字符串问题一样,可以开辟

【转】重复输出一个给定的字符串的几种方法

方法1:通过 `while` 循环重复输出一个字符串 解题思路:while 语句只要指定的条件计算结果为true的时候,就执行其语句.while 语句的语法是这样的: 1 while (expression) 2 statement 在每次通过循环之前计算条件结果.如果条件为true,则执行语句.如果条件为false,则执行继续 while 循环之后的任何语句. 只要条件为true,语句就会执行. 这里是解决方案: function repeatString(str, times) { //空字