力扣214题最短回文串题目描述如下:
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
而网易开发岗第一题则是换了种问法:在字符串后面添加字符串将其转换为回文串,找到并返回可以用这种方式转换的最短回文串。
如输入:noon,输出:noon;
输入:noo,输出:noon;
输入:helloworld,输出:helloworldlrowolleh
使用C++编写的代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;
string shortestPalindrome(string s)
{
int n = s.size();//字符串长度
string rev(s);
reverse(rev.begin(), rev.end());//反转字符串
string s_new = rev + "#" + s;//匹配表
int n_new = s_new.size();//返回匹配表的长度
vector<int> f(n_new, 0);//创建一个数组,包含n_new个元素,初始化为0,最后一个元素存放rev与s重叠字符的个数
for (int i = 1; i<n_new; i++)//遍历字符串s_new和数组f
{
int t = f[i - 1];
while (t>0 && s_new[i] != s_new[t])
t = f[t - 1];
if (s_new[i] == s_new[t])
++t;
f[i] = t;
}
//return rev.substr(0,n - f[n_new - 1])+s;//f[n_new-1]为数组f的最后一个元素即重叠字符的长度,n-f[n_new-1]为获取子串的长度
return s + rev.substr(f[n_new-1],n-f[n_new-1]);
}
int main()
{
string s11 = "noon";
string s12 = "noo";
string s13 = "helloworld";
string s21 = shortestPalindrome(s11);
string s22 = shortestPalindrome(s12);
string s23 = shortestPalindrome(s13);
cout << s21<< endl;
cout << s22 << endl;
cout << s23 << endl;
return 0;
}