LeetCode 5_Longest Palindromic Substring
LeetCode 5_Longest Palindromic Substring
题目描写叙述:
Given a string S,
find the longest palindromic substring in S.
You may assume that the maximum length of S is
1000, and there exists one unique longest palindromic substring. 也即:求字符串中最长回文子串。
回文是什么我就不多少了。能够百度下!
方法一:暴力法(O(n^3))
两层循环扫描字符串的全部子串,之后推断选出的字符子串是否是回文,若是则看其长度!
代码例如以下:
- class Solution {
- public:
- string longestPalindrome(string s)
- {
- // 暴力法O(n^3)
- int n = s.size();
- if (n == 0 || n == 1)
- return s;
- int maxLength = 1;
- int k1 = 0, k2 = 0;
- for (int i = 0; i < n; i++)
- {
- for (int j = i + 1; j < n; j++)
- {
- int k = 0;
- int sign = 0;
- while (k < (j - i + 1)/2 && s[i + k] == s[j - k])
- k++;
- if(k == (j - i + 1) / 2 )
- {
- sign = 1;
- if (j - i + 1 > maxLength)
- {
- maxLength = j - i + 1;
- k1 = i;
- k2 = j;
- if (maxLength == n - i)
- return s.substr(k1,k2+1);
- }
- }
- }
- }
- return s.substr(k1,k2+1);
- }
不用说,肯定超时。显然暴力法有非常大的优化空间。在推断子串的时候肯定有非常多反复的情况,能够用一个表记录已经推断的情况!
因为题目说能够假定字符串的长度不超过1000,所以建立一个table[1000][1000] 的bool表,初始化为false。如果某子串(如果 i 到 j )为回文。令table[ i ][ j ]为true。之后推断的时候先查表和更新表。代码例如以下:
- class Solution {
- public:
- string longestPalindrome(string s)
- {
- int n = s.length();
- if(n == 0 || n == 1)
- return s;
- int maxLength = 1;
- int palindromBegin = 0;
- bool table[1000][1000] = {false};
- for(int i = 0; i < n; i++)
- table[i][i] = true;
- for (int i = 0; i < n; i++)
- if(s[i] == s[i + 1])
- {
- table[i][i + 1] = true;
- maxLength = 2;
- palindromBegin = i;
- }
- for (int len = 3; len <= n ; len++)
- {
- for (int i = 0; i < n - len + 1; i++)
- {
- int j = i + len - 1;
- if (s[i] == s[j] && table[i + 1][j - 1] == true)
- {
- table[i][j] = true;
- maxLength = len;
- palindromBegin = i;
- }
- }
- }
- return s.substr(palindromBegin, maxLength);
- }
上面的方法时间复杂度为O(n^2),能够满足题目的要求。
事实上还能够考虑回文的中心点。向两边扩展(回文的中心点能够是摸个字符。也能够是某两个字符的中间),代码例如以下:
- string expandAroundCenter(string s, int c1, int c2) {
- int l = c1, r = c2;
- int n = s.length();
- while (l >= 0 && r <= n-1 && s[l] == s[r]) {
- l--;
- r++;
- }
- return s.substr(l+1, r-l-1);
- }
- class Solution {
- public:
- string longestPalindrome(string s)
- {
- int n = s.length();
- if (n == 0) return "";
- string longest = s.substr(0, 1); // a single char itself is a palindrome
- for (int i = 0; i < n-1; i++) {
- string p1 = expandAroundCenter(s, i, i);
- if (p1.length() > longest.length())
- longest = p1;
- string p2 = expandAroundCenter(s, i, i+1);
- if (p2.length() > longest.length())
- longest = p2;
- }
- return longest;
- }
- };
代码的复杂度为O(n^2)。另一种说复杂度为O(n)的方法,只是我没去看,有兴趣的能够看下: http://www.cnblogs.com/bitzhuwei/p/Longest-Palindromic-Substring-Part-II.html。
LeetCode 5_Longest Palindromic Substring的更多相关文章
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...
- [LeetCode] Longest Palindromic Substring 最长回文串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- Leetcode Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- [LeetCode] Longest Palindromic Substring(manacher algorithm)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- C++ leetcode Longest Palindromic Substring
明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...
- Leetcode:Longest Palindromic Substring分析和实现
问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...
- Leetcode: Longest Palindromic Substring && Summary: Palindrome
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- Leetcode: Longest Palindromic Substring. java
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
随机推荐
- F - Micro-World(简单模拟)
Problem description You have a Petri dish with bacteria and you are preparing to dive into the harsh ...
- HBase编程 API入门系列之get(客户端而言)(2)
心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面是基础,如下 HBase编程 API入门系列之put(客户端而言)(1) package zhouls.bigdata.Hba ...
- Linux的那点事
1.重启nginx服务器 注意,修改了nginx配置文件后最好先检查一下修改过的配置文件是否正确,以免重启后Nginx出现错误影响服务器稳定运行. 判断Nginx配置是否正确命令如下: nginx - ...
- C++多行文本读取
使用的多行读取的代码如下: //读取文本浮点数到多个模式 序列 bool CPicToolsDlg::readTxt2SeqMulti( std::string TxtName, std::vecto ...
- java中的位运算及移位运算
为了方便对二进制位进行操作,Java给我们提供了以下四个二进制位操作符: & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 Java中有三个移位运算符: 左移:&l ...
- 数据迁移 Migration
- CentOS6.9下NFS配置说明
NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...
- python从TXT创建PDF文件——reportlab
使用reportlab创建PDF文件电子书一般都是txt格式的,某些电子阅读器不能读取txt的文档,如DPT-RP1.因此本文从使用python实现txt到pdf的转换,并且支持生成目录,目录能够生成 ...
- 安卓 九宫格 GridView 的表格布局
首先,请大家理解一下“迭代显示”这个概念,这个好比布局嵌套,我们在一个大布局里面重复的放入一些布局相同的小布局,那些重复的部分是由图片和文字组成的小控件,图片在上方,文字在下方,之后我们只需要把这些小 ...
- 【转载】intellij idea如何将web项目打成war包
1.点击[File]->[Project Structure]菜单(或使用Shift+Ctrl+Alt+S快捷键),打开[Project Structure]窗口.如下图: 2.在[Projec ...