• 添加回文串


    题目描述

    对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。

    给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。

    测试样例:
    "ab",2
    返回:"a"
     
    问题分解
    1、找到最长的回文子串
    2、剩余部分就是需要添加的子串
     
    使用Naive查找,寻找最大公共串
    这里用到了:翻转子串==原子串 =>回文子串
    从原串的开头开始找,比较是否与翻转串的末尾相同
    【这里用到了本题的特征:已有的回文子串肯定出现在末尾,不会出现在中间】
     
    string addToPalindrome(string A, int n) {
            string s = A;
            reverse(s.begin(),s.end()); // 取得翻转串
            for(int i=0;i<n;i++) // Naive查找
                 if(A.substr(i,n-i)==s.substr(0,n-i))//求最长公共子串
                    return s.substr(n-i,i);//返回公共集后面剩余字符串
            return string("");
        }
    

      

    //每次删除掉第一个字符,将这个删除掉的字符放入一个新串中
    //如果删除后的字符串是回文串则返回,否则继续第一步
    //逆序ans返回
    class Palindrome {
        bool judge(string str){
            string tmp = str;
            reverse(tmp.begin(), tmp.end());
            return tmp==str;
        }
    public:
        string addToPalindrome(string str, int n) {
            reverse(str.begin(), str.end());
            string ans;
            while (!str.empty()) {
                ans.push_back(str.back());
                str.pop_back();
                if(judge(str))
                    break;
            }
            reverse(ans.begin(), ans.end());
            return ans;
        }
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    【NOIp】NOIp2015
    【题解】Luogu P2899 [USACO008JAN] 手机网络 树形dp
    「EZEC-4.5」走方格
    ZJOI2013 K大数查询
    CF765F Souvenirs
    [Vani有约会] 雨天的尾巴 /【模板】线段树合并
    中国剩余定理(CRT / EXCRT)
    洛谷 P1516 青蛙的约会
    CQOI2009 叶子的染色
    CSP2019 Emiya 家今天的饭
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7260315.html
Copyright © 2020-2023  润新知