zoukankan      html  css  js  c++  java
  • CSU 1328 近似回文词【最长回文字符串(三种方法)】

    输入一行文本,输出最长近似回文词连续子串。所谓近似回文词是指满足以下条件的字符串:

    1. S以字母开头,字母结尾

    2. a(S)和b(S)最多有2k个位置不同,其中a(S)是S删除所有非字母字符并且把所有字母转化成小写之后得到的串,b(S)是a(S)的逆序串。

    比如当k=1时,Race cat是一个近似回文词,因为a(S)=racecat和b(S)=tacecar只有2个位置不同。

    Input

    输入包含不超过25组数据,每组数据包含两行。第一行是整数k(0<=k<=200),第二行为字符串S,包含至少一个字母但不超过1000个字符(换行符不算)。S只包含字符、空格和其他可打印字符(比如逗号,句号),并且不会以空白字符开头。

    Output

    对于每组测试数据,输出最长近似回文子串的长度和起始位置(S的第一个字符是位置1)。如果有多个最长近似回文子串解,起始位置应尽量小。

    Sample Input

    1
    Wow, it is a Race cat!
    0
    abcdefg
    0
    Kitty: Madam, I'm adam.
    

    Sample Output

    Case 1: 8 3
    Case 2: 1 1
    Case 3: 15 8

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<stack>
    #include<bitset>
    #include<cstdlib>
    #include<cmath>
    #include<set>
    #include<list>
    #include<deque>
    #include<map>
    #include<queue>
    #define INF 999999
    using namespace std;
    
    int main()
    {
        int n,i,j;
        char s[1005];
        char ss[1005];
        int p[1005];
        int cnt,maxn,start,cas;
        int kase=1;
    
        while(~scanf("%d",&n))
        {
            getchar();
           // fgets(s,sizeof(ss),stdin);
            gets(s);
            int len=strlen(s);
    
            cnt=0,maxn=0,start=0;
            for(int i=0;i<len;i++)//预处理
            {
                if(isalpha(s[i]))//记录原始位置
                {
                    p[cnt]=i;
                    ss[cnt++]=tolower(s[i]);
                }
            }
            for(i=0;i<cnt;i++)
            {
                cas=0;
                for(j=0;j<=i&&i+j<cnt;j++)
                {
                    if(ss[i-j]!=ss[i+j])
                        cas++;
                    if(cas>n)
                        break;
                }
                j--;
                if(p[i+j]-p[i-j]+1>maxn)
                {
                    maxn=p[i+j]-p[i-j]+1;
                    start=p[i-j];
                }
    
                cas=0;
                for(j=0;j<=i&&i+j+1<cnt;j++)
                {
                    if(ss[i-j]!=ss[i+j+1])
                        cas++;
                    if(cas>n)
                        break;
                }
                j--;
    
                if(j<=-1)
                    continue;
                if(p[i+j+1]-p[i-j]+1>maxn)
                {
                    maxn=p[i+j+1]-p[i-j]+1;
                    start=p[i-j];
                }
            }
            printf("Case %d: %d %d
    ",kase++,maxn,start+1);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    DOM 文本节点 、节点列表
    haslayout综合【转】
    css兼容性详解
    重温textjustify:interideograph
    掌握三点即可轻松打造出良好的交互设计效果
    ASP.NET 中的正则表达式
    Net中的反射使用入门
    ASP.NET2.0页面状态持续[转]
    使用XmlTextWriter对象创建XML文件[转]
    判断SQLSERVER数据库表字段为空的问题
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7385507.html
Copyright © 2011-2022 走看看