Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

Example:

Input: "cbbd"

Output: "bb"

题解:

Solution 1

  暴力搜索,所有可能,注意到"bab"和"baab"两种类型的回文字符串即可。

 class Solution {
public:
string longestPalindrome(string s) {
int start = , len = ;
int n = s.size();
if (n < )
return s;
for (int i = ; i < n - ; ++i) {
rangeOfPalindrome(s, i, i + , start, len); // "baab"
rangeOfPalindrome(s, i, i, start, len); // "bab"
}
return s.substr(start, len);
} void rangeOfPalindrome(const string& s, int left, int right, int& start, int& len) {
int length = len;
int step = ;
while ((left - step >= ) && (right + step < s.size())) {
if (s[left - step] != s[right + step])
break;
++step;
}
length = * (step - ) + right - left + ;
if (length > len) {
len = length;
start = left - (step - );
}
} };

  代码简化:

 class Solution {
public:
string longestPalindrome(string s) {
string res;
int n = s.size(), idx = , len = ;
for (int i = ; i < n; ++i) {
search(s, i, i, idx, len);
search(s, i, i + , idx, len);
}
return s.substr(idx, len);
}
void search(const string& s, int i, int j, int& idx, int& len) {
while (i >= && j < s.size() && s[i] == s[j]) {
--i;
++j;
}
if (len < j - i - ) {
len = j - i - ;
idx = i + ;
}
}
};

Soluion 2

  DP问题。一个长度为 n(n>1) 的回文字符串S(s1, s2,...,sn),若将字符s0和sn+1分别放置在S的首尾,此时如果s0 == sn+1,那么新的字符串S'也一定是回文字符串。

  那么递归式为 dp[i][j] = 1                                            if i == j

           = s[i] == s[j]                            if i + 1 = j

= s[i] == s[j] && dp[i + 1][j - 1]   if i + 1 < j

 class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < )
return s;
int len = , start = ;
vector<vector<int>> dp(n, vector<int>(n, )); for (int i = ; i < n; ++i) {
for (int j = ; j <= i; ++j) {
dp[j][i] = (s[i] == s[j]) && (i - j <= || dp[j + ][i - ]);
if (dp[j][i] && len < i - j + ) {
len = i - j + ;
start = j;
}
}
} return s.substr(start, len);
}
};

  Manacher算法

Solution 3

最新文章

  1. Unity(四)IocContainer 封装类库
  2. React入门 (1)—使用指南(包括ES5和ES6对比)
  3. Jboss7.1 加入realm auth认证 bootsfaces 美化的登录页面
  4. [知识点]平衡树之Splay
  5. 2016/10/28 很久没更了 leetcode解题 3sumcloset
  6. 简单的IOS6和IOS7通过图片名适配
  7. Codeforces 719 E. Sasha and Array (线段树+矩阵运算)
  8. 构建项目AppFuse+QuickStart
  9. c#关键字详解
  10. poj 3393 Lucky and Good Months by Gregorian Calendar(模拟)
  11. java并行体系结构
  12. JAVA多线程与并发学习总结
  13. QString与LPWSTR之间的转换;
  14. Android单个控件占父控件宽度一半且水平居中
  15. django源码分析 LazySetting对象
  16. Android 代码混淆 混淆方案
  17. IDEA 快捷将创建main函数
  18. fedora liveuser 切换root;su -l root
  19. 根域名服务器(root DNS Servers)会被DDoS打垮么?
  20. 贝尔金(Belkin)7231-4P tftp救砖

热门文章

  1. TOGAF和BABOK
  2. 对”唯一键可以包含NULL值,并且每个NULL值都是唯一的(即NULL!=NULL)“理解
  3. Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键
  4. [NOI2008]奥运物流
  5. oracle长连接超时设置
  6. 友盟分享适配iOS9
  7. linux下firefox显示中文乱码的问题
  8. 如何检查BioPerl是否正确安装
  9. java基础(2)-面向对象(1)
  10. volatile的特性