构造回文 给定一个字符串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,const string &str2) {
if (str1 == "" || str2 == "")
return 0;
else
if (str1.back() == str2.back())
return LCS(str1.substr(0, str1.size() - 1), str2.substr(0, str2.size() - 1)) + 1;
else
return max(LCS(str1.substr(0, str1.size() - 1), str2.substr(0, str2.size())), LCS(str1.substr(0, str1.size()), str2.substr(0, str2.size() - 1)));

}
int main() {
string str1;
while (getline(cin,str1)) {
string str2(str1);
reverse(str1.begin(), str1.end());
cout<<str1.length()-LCS(str1, str2);
}
return 0;
}

  

时间: 2024-09-30 14:13:48

构造回文 给定一个字符串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

检测一个字符串是否为回文? 两种方法

/** *    检测一个字符串是否为回文?三种方法? *    方法1:用str.charAt(index) !=  str.charAt(len-i-1) *    方法2:用StringBuilder . reverse反转 *    方法3:用开关控制 */ public class reversChar { public static void main(String[] args) { String str = "123321"; //中文也可以 System.out.pr

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

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

判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)

回文:字符对称排列的字符串,例如ABCBA 思路:根据队:先进先出和栈: 先进后出的原则,进行比较出队和出栈的字符是否相等.如果相等,则为回文. 创建控制台应用程序. 1 #region 字符节点类 2 class CharNode 3 { 4 public char Char //字符 5 { 6 get; 7 set; 8 } 9 public CharNode Next //下一节点 10 { 11 get; 12 set; 13 } 14 public CharNode(char Cha

给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-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的,即可精确表示. 否则将无法用有限的位数来

判断一个字符串通过变化字符的位置,是否可以组成回文

解法就是判断下字符串中是否有某些字符是奇数个,如果这种字符的个数大于1,说明无法组成回文:小于或等于1可以组成回文. 其中用了strlen(),放到for循环里面容易导致程序运行效率下降,比如输入的字符串很大 10^5个字符时 for(int i=0; i<strlen(string); i++)会导致程序运行很慢.改用: int length = strlen(string); for(int i=0; i<length; i++) 可以很大程度提升效率. #include <stdi

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

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