【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. 解题分析: ^_^个人觉得这道题没有什 ...
随机推荐
- java之String
一.构造器 package com.string; import java.io.UnsupportedEncodingException; import java.nio.charset.Chars ...
- js兼容注意事项--仅供参考
做BS开发就难免会用到javascript,而每个浏览器对javascript的支持有不同.这就需要我们程序员去兼容他们,不然有些浏览器就无法运行我们的代码.就会造来客户的投诉,如果让BoSS知道了, ...
- Why Reflection is slowly?(Trail: The Reflection API)
反射的使用 反射通常用于在JVM中应用程序运行中需要检查或者修改运行时行为的项目.这是一个相对高级的特性,并且仅仅可以被对深刻理解java原理的开发者使用.这里给出一个警告的意见,反射是一个强大的技术 ...
- HDU1102--最小生成树
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- CSU 1116 Kingdoms(枚举最小生成树)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只 ...
- 实战CentOS系统部署Hadoop集群服务
导读 Hadoop是一个由Apache基金会所开发的分布式系统基础架构,Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有高 ...
- 关闭MyEclipse Derby服务
MyEclipse的Servers视图出现 MyEclipse Derby服务,一直想把它去掉在网上搜索了下,现已解决. 如下,MyEclipse菜单:window-->Preferences- ...
- SQL手册
来自 W3School 的 SQL 快速参考.可以打印它,以备日常使用. SQL 语句 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE ...
- STM32F103ZET6 用定时器级联方式输出特定数目的PWM(转载)
STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5.TIM8,共6个.这里需要使用定时器的级联功能,ST的RM0008 REV12的P388和P399页上有说明对于特定的定 ...
- c_水程序
* ** This program reads input lines from the standard input and prints ** each input line, followed ...