题目描述
对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。
给定原字符串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; } };
拥抱明天!
不给自己做枷锁去限制自己。
别让时代的悲哀,成为你人生的悲哀。