【题解】回文字

题目描述

  如果一个单词从前和从后读都是一样的,则称为回文字。如果一个单词不是回文字,则可以把它拆分成若干个回文字。编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文字。

输入格式

  一行,包含一个字符串。字符串由小写英文字母组成(a-z),长度不超过100。

输出格式

  一行,为最少的回文字个数。

输入样例

anaban

输出样例

2

题解

  区间dp。先判断当前子串是否是回文串,不是的话直接合并即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string>

using namespace std;

string s;
int f[101][101];
bool flag;

int main()
{
    cin >> s;
    for(register int i = s.size() - 1; i >= 0; i--)
    {
        for(register int j = i; j < s.size(); j++)
        {
            flag = 1;
            for(register int k = i; k < i + (j - i + 1) / 2; k++)
            {
                if(s[k] != s[j - k + i])
                {
                    flag = 0;
                    break;
                }
            }
            if(flag)
            {
                f[i][j] = 1;
                continue;
            }
            f[i][j] = 0xfffff;
            for(register int k = i; k < j; k++)
            {
                f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
            }
        }
    }
    cout << f[0][s.size() - 1];
    return 0;
} 

参考程序

原文地址:https://www.cnblogs.com/kcn999/p/10805123.html

时间: 2024-11-01 12:03:18

【题解】回文字的相关文章

通过“回文字算法”复习C++语言。

一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 (一).给定一个字符串,判断该字符串是否是回文字. (二).给定一个任意字符串,判断是否可以转换为回文字,如果可以转换为回文字,给出具体的算法. 三.C++语言实现版本(JAVA语言版本后续实现) (一)头文件 (BackText.h) /* * BackText.h * * Created on:

最长回文字串理解(学习Manacher&#39;s algorithm)

关于字符串的子串问题,我们经常需要利用的是已经访问的部分的信息,来降低复杂度,和提高效率:在求最长回文子串的问题中,Manacher's algorithm提供了一种很好的机制,虽然部分地方不太容易理解 先说下核心的思想:先对原字符串进行预处理,将字符串"abc"转换为"$#a#b#c#"的形式,既避免了访问越界的问题,又保证每一个字符有至少一个对称的串(真字符,或是假的“#”) 预留两对变量(当前得到的中心位置“center”,和字符串右侧最远位置“R”,以及对称

2238&quot;回文字串&quot;报告

题目描述: 回文串,就是从前往后和从后往前看都是一样的字符串.那么现在给你一个字符串,请你找出该字符串中,长度最大的一个回文子串. 输入描述: 有且仅有一个仅包含小写字母的字符串,保证其长度不超过5000 输出描述: 有且仅有一个正整数,表示最长回文子串的长度 输入样例: abccbxyz 输出样例: 4 分析: 我的算法算是比较暴力的.这道题目中,需要输出最长的回文字串的长度,我的想法是从最长的长度开始寻找是否有回文字串符合这个长度,如果没有,则从次长的长度寻找是否有符合长度的回文字串.比如说

【LeetCode-面试算法经典-Java实现】【125-Valid Palindrome(回文字验证)】

[125-Valid Palindrome(回文字验证)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, "A man, a plan, a canal: Panama" is a palindrome. &quo

回文字算法(java版本)

package com.gdh.backtext;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry; public class BackText { String text; public BackText() { super(); this.text = null; } public BackText(String text) { super(); this.text = text; } publi

最长回文字串 (The longest palindrome substring)

这两天去学了一下,觉得下面那篇文章写的很好,有例子,比较容易懂,所以转一下. 以下内容来自:hihoCoder: 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文

Hdu 3068 最长回文字串Manacher算法

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

P1435 回文字串

P1435 回文字串 题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 "Ab3bd"插入2个字符后可以变成回文词"dAb3bAd"或"Adb3bdA",但是插入少于2个的字符无法变成回文词. 注:此问题区分大小写 输入输出格式 输入格式: 一个字符串(0<strlen<=1000) 输出格

算法_Longest Palindromic Substring(寻找最长回文字串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 题解:首先需要清楚什么是“回文“(不知道这个翻译对不对?)字符串!回文字符串关于某一个字符对称,在左右两边与中心相同距离的字符相等. 那么还需要