zoukankan      html  css  js  c++  java
  • L2-008. 最长对称子串

    L2-008. 最长对称子串

    时间限制
    100 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。

    输入格式:

    输入在一行中给出长度不超过1000的非空字符串。

    输出格式:

    在一行中输出最长对称子串的长度。

    输入样例:
    Is PAT&TAP symmetric?
    
    输出样例:
    11

    一看最长二字,心头油然升起一种恐慌,心中已经定义为最优化问题
    因为DP问题这块硬骨头,自己啃起来实在难受,气焰顿时消了一半。

    http://blog.csdn.net/liuchuo/article/details/52138898?locationNum=3&fps=1

    可看到上面的分析,

    分析:有两种可能,一种是回文字符串的长度为奇数,一种是偶数的情况。i为字符串当前字符的下标。
    当回文字串为奇数的时候,j表示i-j与i+j构成的回文字串长度;当回文字串长度为偶数的时候,j表示i+1左边j个字符一直到i右边j个字符的回文字串长度~~~

    用maxvalue保存遍历结果得到的最大值并且输出~~

    #include <iostream>
    using namespace std;
    int main() {
        string s;
        getline(cin, s);
        int maxvalue = 0, temp;
        int len = s.length();
        for(int i = 0; i < len; i++) {
            temp = 1;
            ///回文串为奇数
            for(int j = 1; j < len; j++) {
                if(i - j < 0 || i + j >= len || s[i - j] != s[i + j])
                    break;
                temp += 2;
            }
            ///回文串为偶数
            maxvalue = temp > maxvalue ? temp : maxvalue;
            temp = 0;
            for(int j = 1; j < len; j++) {
                if(i - j + 1 < 0 || i + j >= len || s[i - j + 1] != s[i + j])
                    break;
                temp += 2;
            }
            maxvalue = temp > maxvalue ? temp : maxvalue;
        }
        cout << maxvalue;
        return 0;
    }

    十分清晰,十分容易,思维巧妙,我怎么想不到?

  • 相关阅读:
    最好的在线打字练习网站
    input 的 type 等于 file
    windows 删除文件或文件夹
    nvm 管理 node 版本
    github 的 fork 取消功能
    window cmd 命令行下创建文件夹和文件
    17_10_11 Redis 指令
    17_10_11 Mac 上的brew 安装指令
    17_10_11 运算符&,&&,>> 和 >>>
    17_10_10 乱码问题总结
  • 原文地址:https://www.cnblogs.com/kimsimple/p/6533678.html
Copyright © 2011-2022 走看看