首页 > 其他分享 > 切割回文

切割回文

时间:2023-06-10 10:13:09浏览次数:40  
标签:切割 int 样例 阿福 字符串 回文

题目描述

阿福最近对回文串产生了非常浓厚的兴趣。

如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串。例如,abcaacba 是一个回文串,abcaaba 则不是一个回文串。

阿福现在强迫症发作,看到什么字符串都想要把它变成回文的。阿福可以通过切割字符串,使得切割完之后得到的子串都是回文的。

现在阿福想知道他最少切割多少次就可以达到目的。例如,对于字符串 abaacca,最少切割一次,就可以得到 abaacca 这两个回文子串。

输入

输入的第一行是一个整数 TTT (T≤20)(T \le 20)(T≤20) ,表示一共有 TTT 组数据。 接下来的 TTT 行,每一行都包含了一个长度不超过的 100010001000 的字符串,且字符串只包含了小写字母。

输出

对于每组数据,输出一行。该行包含一个整数,表示阿福最少切割的次数,使得切割完得到的子串都是回文的。

输入输出样例

样例输入 #1

3
abaacca
abcd
abcba

样例输出 #1

1
3
0

提示

对于第一组样例,阿福最少切割 111 次,将原串切割为 abaacca 两个回文子串。

对于第二组样例,阿福最少切割 333 次,将原串切割为 abcd 这四个回文子串。

对于第三组样例,阿福不需要切割,原串本身就是一个回文串。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N],a[N],n,res,m,t;
bool vis[1010][1010];
string s;
bool check(int st,int ed)//用于判断是不是回文串
{
    while(st<=ed){
        if(s[st]==s[ed]) st++,ed--;
        else return false;
    }
    return true;
}
int main()
{
    cin>>t;
    while(t--)
    {
        memset(f,1,sizeof f);//因为要求最小值,所以先初始化为最大
        memset(vis,false,sizeof vis);
        cin>>s;
        res=s.size();
        for(int i=0;i<res;i++)
            for(int j=i+1;j<res;j++) if(check(i,j)) vis[i][j]=true;//判断每个片段是否是回文串
        f[1]=0;//第一个字符不需要切割也是,所以为0
        for(int i=2;i<=res;i++)
        {
            if(vis[0][i-1]) f[i]=0;//如果在这之前的是回文串那么从这个点开始就不需要切割
            else f[i]=f[i-1]+1;//否则+1,继续切割
            for(int j=i;j>=1;j--) if(vis[j-1][i-1])  f[i]=min(f[i],f[j-1]+1);//然后从这之前再判断,有可能前面存在f=0,更新状态
        }
        cout<<f[res]<<endl;
    }
    return 0;
}

 

标签:切割,int,样例,阿福,字符串,回文
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17470820.html

相关文章

  • [SHOI2011]双倍回文 题解
    [SHOI2011]双倍回文题解看了一些写回文自动机的大佬的代码,我深感敬畏,于是我转身向Manacher走去现在荣登最优解第一页……说实话,这个方法的复杂度是很玄学的,但是加了一些优化之后,就几乎不可能被卡到\(O(n^2)\)了。具体思路如下:预处理字符串部分就略过吧我们预先跑一......
  • 回文数与字符数组
    争取一天一道找实习前刷满500道今天写了一道简单的力扣题,回文数与字符数组Stringres=Integer.toString(x);Stringresrev="";for(inti=0;i<res.length();i++){resrev=res.charAt(i)+resr......
  • 【Leetcode】5-最长回文子串
    1.一般方法:暴力for循环求解,时间复杂度,空间复杂度。2.动态规划:我们发现在匹配过程中有许多重复计算的部分,我们把这些放到一个表里保存起来会减少运算,用空间换时间。时间复杂度,空间复杂度。例如“babab”字符串对应的表为:dp[i][j]为TRUE代表字符串从i到j为回文串。判断i到j是否为回文......
  • 516. 最长回文子序列
    给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例1:输入:s="bbbab"输出:4解释:一个可能的最长回文子序列为"bbbb"。>动态规划classSolution{public:......
  • 647. 回文子串
    给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。回文字符串是正着读和倒过来读一样的字符串。子字符串是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。输入:s="abc"输出:3解释:三......
  • LeetCode 9.回文数
    LeetCode9.回文数思路分两种情况。如果值为负数,则当前数肯定不是回文数如果值为正数,则将其数值反转后与原数值比较,如果相同则是回文数代码classSolution{publicbooleanisPalindrome(intx){if(x<0)returnfalse;inttmp=0,num=x;while(num......
  • 字符串进行切割——split() 方法
    Python的split()方法可以对字符串进行切割,得到一个字符串列表。该方法的语法是:pythonstring.split(sep=None,maxsplit=-1)参数说明:-sep:分隔符,默认是所有的空字符,包括空格、换行(\n)、制表符(\t)等。-maxsplit:切割的次数,默认是-1,代表切割所有的分隔符。例如:......
  • 算法刷题记录:[NOIP1999]回文数
    题目链接https://ac.nowcoder.com/acm/contest/19859/G题目分析高精度相加+进制转换+判断回文的模拟题。AC代码//Problem:[NOIP1999]回文数//Contest:NowCoder//URL:https://ac.nowcoder.com/acm/contest/19859/G//MemoryLimit:262144MB//TimeLimit:20......
  • POJ3695(矩形切割中等题)
    题目:Rectangles 题意:给N个矩形,他们可能会重叠,然后给M个询问,每个询问给出指定的矩形位置,然后分别计算每个询问中选中的矩形的并。 本题跟求所有矩形的并一个思路,只是再增加一个数组来保存选中矩形的位置,然后直接求并即可。#include<stdio.h>#include<string.h>#include<algor......
  • POJ1151(矩形切割入门题)
    题目:Atlantis 我的上一篇文章已经讲明了线段切割的思想,矩形切割就是把线段切割从一维推到二维就行了,思想都一样。#include<stdio.h>#include<string.h>constintN=205;typedefstruct{doublex1,y1;doublex2,y2;doublesum;}Node;NodeT[N];intn......