• 关于回文字符串


    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)
    接下来的N行,每行一个字符串,每个字符串长度不超过1000.
    输出
    每行输出所需添加的最少字符数
    样例输入
    1
    Ab3bd
    样例输出
    2
    分析:d[i][j]表示从第 i 到第 j 的最优解;
    if(a[i]==a[j]) d[i][j]=d[i+1][j-1];
    d[i][j]=max{d[i][j] , d[i+1][j]+1 , d[i][j-1]+1};
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define N 1010
    using namespace std;
    
    int d[N][N];
    char a[N];
    
    int min(int x,int y)
    {
        return x<y?x:y;
    }
    
    int main()
    {
        int i,j,p,n,test;
        scanf("%d",&test);
        while(test--)
        {
            scanf("%s",a+1);
            n=strlen(a+1);
            for(i=1;i<=n;i++) d[i][i]=d[i][i-1]=0;
            for(p=1;p<n;p++)
            {
                for(i=1;i<=n-p;i++)
                {
                    j=i+p;
                    d[i][j]=10000;
                    if(a[i]==a[j]) d[i][j]=d[i+1][j-1];
                    d[i][j]=min(d[i][j],d[i+1][j]+1);
                    d[i][j]=min(d[i][j],d[i][j-1]+1);
                }
            }
            printf("%d
    ",d[1][n]);
        }
        return 0;
    }
  • 相关阅读:
    struct tm->time() localtime() gmtime()
    解决VS2013中“This function or variable may be unsafe”的问题
    vm虚拟机三种网络模式
    vulnhub靶机-Raven解题思路
    vulnhub靶机-VulnOs:v2解题思路
    信息收集
    vulnhub靶机-SickOs1.2解题思路
    vulnhub靶机-SickOs解题思路
    vulnhub靶机-SkyTower解题思路
    vulnhub靶场-Stapler解题思路
  • 原文地址:https://www.cnblogs.com/rainhome/p/5456333.html
Copyright © 2020-2023  润新知