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))

两层循环扫描字符串的全部子串,之后推断选出的字符子串是否是回文,若是则看其长度!

代码例如以下:

  1. class Solution {
  2. public:
  3. string longestPalindrome(string s)
  4. {
  5. // 暴力法O(n^3)
  6. int n = s.size();
  7. if (n == 0 || n == 1)
  8. return s;
  9. int maxLength = 1;
  10. int k1 = 0, k2 = 0;
  11. for (int i = 0; i < n; i++)
  12. {
  13. for (int j = i + 1; j < n; j++)
  14. {
  15. int k = 0;
  16. int sign = 0;
  17. while (k < (j - i + 1)/2 && s[i + k] == s[j - k])
  18. k++;
  19. if(k == (j - i + 1) / 2 )
  20. {
  21. sign = 1;
  22. if (j - i + 1 > maxLength)
  23. {
  24. maxLength = j - i + 1;
  25. k1 = i;
  26. k2 = j;
  27. if (maxLength == n - i)
  28. return s.substr(k1,k2+1);
  29. }
  30. }
  31. }
  32. }
  33. return s.substr(k1,k2+1);
  34. }

不用说,肯定超时。显然暴力法有非常大的优化空间。在推断子串的时候肯定有非常多反复的情况,能够用一个表记录已经推断的情况!

因为题目说能够假定字符串的长度不超过1000,所以建立一个table[1000][1000] 的bool表,初始化为false。如果某子串(如果 i 到 j )为回文。令table[ i ][ j ]为true。之后推断的时候先查表和更新表。代码例如以下:

  1. class Solution {
  2. public:
  3. string longestPalindrome(string s)
  4. {
  5. int n = s.length();
  6. if(n == 0 || n == 1)
  7. return s;
  8. int maxLength = 1;
  9. int palindromBegin = 0;
  10. bool table[1000][1000] = {false};
  11. for(int i = 0; i < n; i++)
  12. table[i][i] = true;
  13. for (int i = 0; i < n; i++)
  14. if(s[i] == s[i + 1])
  15. {
  16. table[i][i + 1] = true;
  17. maxLength = 2;
  18. palindromBegin = i;
  19. }
  20. for (int len = 3; len <= n ; len++)
  21. {
  22. for (int i = 0; i < n - len + 1; i++)
  23. {
  24. int j = i + len - 1;
  25. if (s[i] == s[j] && table[i + 1][j - 1] == true)
  26. {
  27. table[i][j] = true;
  28. maxLength = len;
  29. palindromBegin = i;
  30. }
  31. }
  32. }
  33. return s.substr(palindromBegin, maxLength);
  34. }

上面的方法时间复杂度为O(n^2),能够满足题目的要求。

事实上还能够考虑回文的中心点。向两边扩展(回文的中心点能够是摸个字符。也能够是某两个字符的中间),代码例如以下:

  1. string expandAroundCenter(string s, int c1, int c2) {
  2. int l = c1, r = c2;
  3. int n = s.length();
  4. while (l >= 0 && r <= n-1 && s[l] == s[r]) {
  5. l--;
  6. r++;
  7. }
  8. return s.substr(l+1, r-l-1);
  9. }
  10. class Solution {
  11. public:
  12. string longestPalindrome(string s)
  13. {
  14. int n = s.length();
  15. if (n == 0) return "";
  16. string longest = s.substr(0, 1); // a single char itself is a palindrome
  17. for (int i = 0; i < n-1; i++) {
  18. string p1 = expandAroundCenter(s, i, i);
  19. if (p1.length() > longest.length())
  20. longest = p1;
  21.  
  22. string p2 = expandAroundCenter(s, i, i+1);
  23. if (p2.length() > longest.length())
  24. longest = p2;
  25. }
  26. return longest;
  27. }
  28. };

代码的复杂度为O(n^2)。另一种说复杂度为O(n)的方法,只是我没去看,有兴趣的能够看下: http://www.cnblogs.com/bitzhuwei/p/Longest-Palindromic-Substring-Part-II.html。

LeetCode 5_Longest Palindromic Substring的更多相关文章

  1. LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium

    题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...

  2. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  3. Leetcode Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  4. [LeetCode] Longest Palindromic Substring(manacher algorithm)

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  5. C++ leetcode Longest Palindromic Substring

    明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...

  6. Leetcode:Longest Palindromic Substring分析和实现

    问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...

  7. Leetcode: Longest Palindromic Substring && Summary: Palindrome

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  8. LeetCode:Longest Palindromic Substring 最长回文子串

    题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  9. Leetcode: Longest Palindromic Substring. java

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

随机推荐

  1. F - Micro-World(简单模拟)

    Problem description You have a Petri dish with bacteria and you are preparing to dive into the harsh ...

  2. HBase编程 API入门系列之get(客户端而言)(2)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面是基础,如下 HBase编程 API入门系列之put(客户端而言)(1) package zhouls.bigdata.Hba ...

  3. Linux的那点事

    1.重启nginx服务器 注意,修改了nginx配置文件后最好先检查一下修改过的配置文件是否正确,以免重启后Nginx出现错误影响服务器稳定运行. 判断Nginx配置是否正确命令如下: nginx - ...

  4. C++多行文本读取

    使用的多行读取的代码如下: //读取文本浮点数到多个模式 序列 bool CPicToolsDlg::readTxt2SeqMulti( std::string TxtName, std::vecto ...

  5. java中的位运算及移位运算

    为了方便对二进制位进行操作,Java给我们提供了以下四个二进制位操作符: &    按位与 |     按位或 ^    按位异或 ~    按位取反 Java中有三个移位运算符: 左移:&l ...

  6. 数据迁移 Migration

  7. CentOS6.9下NFS配置说明

    NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...

  8. python从TXT创建PDF文件——reportlab

    使用reportlab创建PDF文件电子书一般都是txt格式的,某些电子阅读器不能读取txt的文档,如DPT-RP1.因此本文从使用python实现txt到pdf的转换,并且支持生成目录,目录能够生成 ...

  9. 安卓 九宫格 GridView 的表格布局

    首先,请大家理解一下“迭代显示”这个概念,这个好比布局嵌套,我们在一个大布局里面重复的放入一些布局相同的小布局,那些重复的部分是由图片和文字组成的小控件,图片在上方,文字在下方,之后我们只需要把这些小 ...

  10. 【转载】intellij idea如何将web项目打成war包

    1.点击[File]->[Project Structure]菜单(或使用Shift+Ctrl+Alt+S快捷键),打开[Project Structure]窗口.如下图: 2.在[Projec ...