leetcode(5)—— Longest Palindromic Substring(最长回文子串)
2016-04-15 16:00
579 查看
longest-palindromic-substring
但会超时,不可取。
dp[i][j]:表示子字符串 s[i:j] 是否为回文;
初始化 dp[i][i] == true(自己到自己,单独的字符作为子串), dp[i][i-1] == true,其余为false
dp[i][j] == (s[i] == s[j] && (dp[i+1][j-1]))
法1:暴力搜索(但会超时)
遍历全部子串(n+(n−1)+…+1=n(1+n)2),逐一判断:bool isPalindromic(string s) { int n = s.size(); int i = 0; while (i < n - 1 - i) { if (s[i] != s[n - 1 - i]) return false; ++i; } return true; } class Solution { public: string longestPalindrome(string s) { int max_len = 0; int idx = 0; int i, j; for ( i = 0; i < s.size() - 1; ++i) { for (j = i + 1; j < s.size(); ++j) { if (isPalindromic(s.substr(i, j - i + 1)) && j - i + 1> max_len) { max_len = j - i + 1; idx = i; } } } return s.substr(idx, max_len); } };
但会超时,不可取。
法2:动态规划
暴力搜索产生大量重复判断,也即动态规划中的重叠子问题,解决重叠子问题,自然跑不了使用动态规划。dp[i][j]:表示子字符串 s[i:j] 是否为回文;
初始化 dp[i][i] == true(自己到自己,单独的字符作为子串), dp[i][i-1] == true,其余为false
dp[i][j] == (s[i] == s[j] && (dp[i+1][j-1]))
class Solution { public: string longestPalindrome(string s) { bool dp[1000][1000]; memset(dp, 0, sizeof(dp)); int n = s.size(); dp[0][0] = true; for (int i = 1; i < n; ++i) { dp[i][i] = true; dp[i][i-1] = true; } int lft = 0, rgt = 0; for (int k = 2; k <= n; ++k) { for (int i = 0; i <= n-k; ++i) // 注意:是可以取到 n-k 的,(n-1)-(n-k)+1 == k { if (s[i] == s[i+k-1] && dp[i+1][i+k-2]) { dp[i][i+k-1] = true; if (rgt-lft + 1 < k) { lft = i; rgt = i+k-1; } } } } return s.substr(lft, rgt-lft+1); } };
References
[1] LeetCode:Longest Palindromic Substring 最长回文子串相关文章推荐
- 总结前端面试过程中最容易出现的问题
- 探索 ConcurrentHashMap 高并发性的实现机制
- 使用VMWare虚拟机创建CentOS版本号的Linux学习环境(每一步都有截图与说明)
- AngularJS datepicker 和 datatimepicker
- Jenkins --SVN
- jquery对dom节点的操作【推荐】
- kafka学习二:在linux环境下kafka搭建环境(单机版)
- android开发中单击事件的多种实现方法
- QT Webkit的插件Plugin设计实现
- 剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充
- toast文字偏离不居中
- Mac利用PD虚拟机安装Centos7
- win7配置自己的IIS服务器亲自做的图文很详细
- 二叉搜索树的基本java实现
- uva1362
- 在线编程--集合栈
- 作业调度模拟程序
- AES-OZ745 OZ745 Zynq-7000 开发板与套件
- JAVA静态
- 个人初做小游戏RunRunMagic(五) 总结