添加回文串

Posted 王小东大将军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添加回文串相关的知识,希望对你有一定的参考价值。

题目描述

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

给定原字符串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;
    }
};

  

以上是关于添加回文串的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛入门经典 例题 3-4 回文串

添加回文串

2021-06-05:一个字符串至少需要添加多少个字符能整体变成回文串?

最长回文字串暴力

回文串(最长公共子序列)

2021-06-07:一个字符串添加最少的字符变成回文串,回文串有多个,请返回所有结果。