Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

For example:

Given "aacecaaa", return "aaacecaaa".

Given "abcd", return "dcbabcd".

思路:

写了三份代码,各种超时。知道肯定要用之前学了几遍也记不住的方法了--判断最长回文的O(N)算法Manacher算法。

特别注意:

s[i]这样的写法非常耗时!

    //Manacher算法
string shortestPalindrome(string s){
if(s.size() <= ) return s;
string ss = "$#";
for(auto c : s) //这样写只需要12ms
ss+=c, ss+='#';
//for(int i = 0; i < s.size(); ++i) //先把字符串转换一下 这样写非常慢 240ms时间都耗在这里了
// ss = ss + s[i] + "#"; vector<int> P( * s.size() + , ); //存储以i为中心回文的最大半径
int e = ;
int id = , mx = ; //id为可以管的最远的回文的中心点 mx是id可以管到的最远距离 在回文的后面一个位置
for(int i = ; i < ss.size(); ++i)
{
P[i] = (mx > i) ? min(P[ * id - i], mx - i) : ; //根据之前的信息 获取当前中心点的最短回文长度
while(i + P[i] < ss.size() && ss[i + P[i]] == ss[i - P[i]]) //扩展回文长度 注意不要越界
P[i]++;
if(i + P[i] > mx) //更新最远距离和中心点
{
mx = i + P[i];
id = i;
}
if(i == P[i]) e = i + P[i] - ; //该回文的第一个位置是源字符串的第一个字母 记录回文截至位置
}
e = e / - ; //把回文最长的截至位置转换为在原字符串中的位置
string rs = s.substr(e + , s.size() - e); //在字符串前面补上不够回文的部分
reverse(rs.begin(), rs.end());
return rs + s;
}

大神4ms的代码,其实思路都一样,可大神的代码时间就是短!

string shortestPalindrome(string s) {
int n1=s.length();
string mystr="$";//2*n1+1
int n=*n1+;
for(auto c : s)
mystr+=c, mystr+='$';
int* plen=new int[n];
int pali_len=;
int i, k, mid=, l=-;
for(i=; i<=n/; i++)
{
k=;
if(i<l&&*mid-i>-) k=min(plen[*mid-i], l-i);
while(i-k->-&&i+k+<n&&mystr[i-k-]==mystr[i+k+]) k++;
plen[i]=k;
if(i+k>l) mid=i, l=i+k;
}
for(i=n/; i>-; i--)
if(plen[i]==i) {pali_len=i; break;}
string t=s.substr(i);
reverse(t.begin(), t.end());
return t+s;
}

三个超时的常规思路代码:

bool isPalindrome(string s, int start, int end)
{
while(start <= end)
if(s[start++] != s[end--])
return false;
return true;
} //超时
string shortestPalindrome1(string s) {
if(s.size() <= ) return s;
int e = ;
for(int i = s.size() - ; i >= ; --i) //找到包括第一个字母的最长回文
{
if(isPalindrome(s, , i))
{
e = i;
break;
}
} string rs = s.substr(e + , s.size() - e);
reverse(rs.begin(), rs.end());
return rs + s;
} //超时
string shortestPalindrome2(string s){
if(s.size() <= ) return s;
for(int i = s.size() - ; i >= ; --i) //遍历可能回文的最后一个位置
{
if(s[i] == s[]) //如果第一个字符和最后位置相同
{
int slen = (i + ) / ; //回文一半的长度 奇数个则不要最中间的
string s1 = s.substr(, slen);
string s2 = s.substr(i - slen + , slen);
reverse(s2.begin(), s2.end());
if(s1 == s2) //是回文
{
string rs = s.substr(i + , s.size() - i);
reverse(rs.begin(), rs.end());
return rs + s;
}
}
}
} //超时
string shortestPalindrome3(string s){
if(s.size() <= ) return s;
for(int i = s.size() - ; i >= ; --i) //遍历可能回文的最后一个位置
{
if(s[i] == s[]) //如果第一个字符和最后位置相同
{
int slen = (i + ) / ; //回文一半的长度 奇数个则不要最中间的
string s1 = s.substr(, slen);
string s2 = s.substr(i - slen + , slen);
reverse(s2.begin(), s2.end());
unordered_set<string> uset;
uset.insert(s1);
if(uset.find(s2) != uset.end())
{
string rs = s.substr(i + , s.size() - i);
reverse(rs.begin(), rs.end());
return rs + s;
}
}
}
}

【leetcode】Shortest Palindrome(hard)★的更多相关文章

  1. 【Leetcode】Shortest Palindrome

    Shortest Palindrome Given a string S, you are allowed to convert it to a palindrome by adding charac ...

  2. 【leetcode】1278. Palindrome Partitioning III

    题目如下: You are given a string s containing lowercase letters and an integer k. You need to : First, c ...

  3. 【LeetCode】336. Palindrome Pairs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...

  4. 【LeetCode】9. Palindrome Number 回文数

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:回文数,回文,题解,Leetcode, 力扣,Python ...

  5. 【LeetCode】234. Palindrome Linked List 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. 【LeetCode】131. Palindrome Partitioning 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...

  7. 【leetcode】Valid Palindrome

    题目简述: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...

  8. 【题解】【字符串】【Leetcode】Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  9. 【leetcode】9. Palindrome Number

    题目描述: Determine whether an integer is a palindrome. Do this without extra space. 解题分析: ^_^个人觉得这道题没有什 ...

随机推荐

  1. ie8及其以下浏览器的document.getElementsByClassName兼容性问题

    使用JavaScript访问DOM的一个重大问题是,此过程需要一种通过元素类名称来选择类的类函数,对DOMContentReady,这种类函数的缺失导致开发人员需要自己编写自定义脚本业执行上述任务,许 ...

  2. AngularJS 使用$sce控制代码安全检查

    由于浏览器都有同源加载策略,不能加载不同域下的文件.也不能使用不合要求的协议比如file进行访问. 在angularJs中为了避免安全漏洞,一些ng-src或者ng-include都会进行安全校验,因 ...

  3. Notepad++的插件

    1.4. Notepad++中常用的插件 1.4.1. 插件管理器: Plugin Manager 插件功能:此插件可以帮你管理插件,包括查看当前已经安装的插件有哪些,以及自动帮你下载相应的插件. 插 ...

  4. GCD与NSOperationQueue

    1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装 2> GCD只支持FIFO(先入先出)的队列,NSOperationQueue可以很方便地调整执 ...

  5. C#深入浅出 修饰符(二)

    1.函数参数前的修饰符 params ,ref ,out params修饰的数据类型只能数组,用于参数不固定时:且此参数位于所有形式参数的最后: public static int GetMax(pa ...

  6. zabbix 3.0.4 Nginx 性能监控

    搭建Nginx 安装pcre-devel .zlib-devel支持包 [root@test /]# yum -y install pcre-devel zlib-devel 创建nginx用户 [r ...

  7. 在应用中嵌入Python:转

    在应用中嵌入Python 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python ...

  8. Sqli-LABS通关笔录-12

    通过这个关卡我学习到了: 1.双引号千万别忘记,就是因为忘了弄了好一会儿.一直不报错. 2. 00x1万能密码构造二 报错的内容为: You have an error in your SQL syn ...

  9. OpenCV高斯模型

    int main(int argc, char** argv) { //std::string videoFile = "E:\\C_VC_code\\Text_Photo\\dingdan ...

  10. fzu2188 状压dp

    G - Simple String Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...