【leetcode】Shortest Palindrome(hard)★
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)★的更多相关文章
- 【Leetcode】Shortest Palindrome
Shortest Palindrome Given a string S, you are allowed to convert it to a palindrome by adding charac ...
- 【leetcode】1278. Palindrome Partitioning III
题目如下: You are given a string s containing lowercase letters and an integer k. You need to : First, c ...
- 【LeetCode】336. Palindrome Pairs 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...
- 【LeetCode】9. Palindrome Number 回文数
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:回文数,回文,题解,Leetcode, 力扣,Python ...
- 【LeetCode】234. Palindrome Linked List 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】131. Palindrome Partitioning 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...
- 【leetcode】Valid Palindrome
题目简述: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...
- 【题解】【字符串】【Leetcode】Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- 【leetcode】9. Palindrome Number
题目描述: Determine whether an integer is a palindrome. Do this without extra space. 解题分析: ^_^个人觉得这道题没有什 ...
随机推荐
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- ImageView.ScaleType8种用法
1·ImageView.ScaleType.center:图片位于视图中间,但不执行缩放. 2·ImageView.ScaleType.CENTER_CROP 按统一比例缩放图片(保持图片的尺寸比例) ...
- jdk版本及编译版本导致服务器部署UnsupportedClassVersionError错误
java本地代码运行正常,部署到服务器无法运行,错误如下: Caused by: java.lang.UnsupportedClassVersionError: com/teshehui/cms/ac ...
- 谈谈使用echarts过程中踩过的坑
小结: 1. 使用jquery获取json对象遇到的问题 由于自己对ajax用的还不熟练,之前都是拷贝别人的代码拿来用的,这次自己写的时候倒是碰到好多麻烦一一列举如下: 1.1 在$ 与ajax之间还 ...
- 外国类似stackoverflow这样的网站访问慢怎么解决-遁地龙卷风
第二版 百度搜索蓝灯 下载桌面版 双击运行 如果打开的浏览器不是你想要的 拷贝地址栏地址给你想要的浏览器 一切就ok了!!!!! 建议不访问国外网站时,便将蓝灯关掉,否则在访问一些不开蓝灯能够正常访问 ...
- Android ListView 图片异步加载和图片内存缓存
开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...
- Bellman_Ford
Source:http://www.cnblogs.com/Jason-Damon/archive/2012/04/21/2460850.html 摘自百度百科 Bellman-ford算法是求含负权 ...
- ORA-14402: 更新分区关键字列将导致分区的更改
默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改.這種情況可以通過開啟表 ...
- iOS使用webView 加载网页,在模拟器中没有问题,而真机却白屏了。App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist f
还在info.plist中配置.除了配置允许上网的配置之外,还有另一项.
- HDU 1083 网络流之二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...