题目:leetcode 214.最短回文数
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入: "aacecaaa"
输出: "aaacecaaa"
示例 2:
输入: "abcd"
输出: "dcbabcd"
题目分析:
回文数判断算法(Rabin-Karp字符串哈希算法)
代码:
#include <iostream> #include<algorithm> using namespace std; class solution{ public: string shortestPalindrome(string s){ int base=107,mod=10000017; int n=s.size(); long long left=0,right=0; long long base_r=1; int best=-1;//解决字符串为空的问题,在best之前的子字符串为回文数字符串 string add; for (int i=0;i<n;i++){ left=(left*base+s[i])%mod; //对应s1的哈希值计算 right=(right+s[i]*base_r)%mod; //对应s2的哈希值计算 if (left==right){best=i;} base_r=(base_r*base)%mod; } add= (best==n-1 ? "" : s.substr(best+1,n));//如果best在s的最后一位,则add为空,否则add为best+1到字符串末尾的子字符串。 reverse(add.begin(),add.end());
cout<<"原字符串: "<<s<<endl; return add+s; } }; int main() {
solution f;
cout<<"更新后的回文数字符串:"<<f.shortestPalindrome("aacecaaa")<<endl;
return 0; }
结果截图:
原文:https://www.cnblogs.com/Ycc-LearningRate/p/13583854.html