[LeetCode]Longest Palindromic Substring
来源:互联网 发布:触摸查询软件 编辑:程序博客网 时间:2024/06/18 01:46
题目要求如下:
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.
也就是传说中的求最长回文子串的问题,具体的算法分析请点本博客的文章《求最长回文子串(Longest Palindromic Substring)》
尝试用动态规划和中心扩展法都做了一下,发现动态规划的时间要比中心扩展法多出4倍左右,可能是因为对数组的访问导致了时间的增加,而中心扩展法只需要遍历字串而不需要同时访问2维数组,所以更快。另外在LeetCode中用动态数组会出错,不知道什么原因。
以下是2种方法的代码,欢迎大牛指导交流~
1.动态规划法
AC,Runtime: 552 ms
//LeetCode_Longest Palindromic Substring//Written by zhou//2013.11.22class Solution {public: string longestPalindrome(string s) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. size_t n = s.length(); /*bool **dp = new bool*[n]; for (size_t i = 0; i < n; ++i) { dp[i] = new bool[n]; }*/ bool dp[1000][1000]; //为基准情况赋值 int startPos = 0; int max = 1; for (size_t i = 0; i < n; ++i) { dp[i][i] = true; if (i + 1 < n) {if (s[i] == s[i+1]){dp[i][i+1] = true;startPos = i;max = 2;}else dp[i][i+1] = false; } } //动规求解,前面已求len = 1, len = 2的情况 for (int len = 3; len <= n; ++len) { for (int i = 0; i < n - len + 1; ++i) { int j = i + len - 1; if (dp[i+1][j-1] && s[i] == s[j]){dp[i][j] = true;int curLen = j - i + 1;if (curLen > max){startPos = i;max = curLen;}}else dp[i][j] = false; } } //释放二维数组 /*for (size_t i = 0; i < n; ++i) delete[] dp[i]; delete[] dp;*/ return s.substr(startPos,max); }};
2. 中心扩展法
AC,Runtime: 132 ms
//LeetCode_Longest Palindromic Substring//Written by zhou//2013.11.22class Solution {public: string longestPalindrome(string s) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. size_t n = s.length(); int startPos = 0; int max = 1; for (int i = 0; i < n; ++i) { int oddLen = 0, evenLen = 0, curLen; oddLen = Palindromic(s,i,i); if (i + 1 < n) evenLen = Palindromic(s,i,i+1); curLen = oddLen > evenLen? oddLen : evenLen; if (curLen > max) { max = curLen; if (max & 0x1) startPos = i - max / 2; else startPos = i - (max - 1) / 2; } } return s.substr(startPos,max); } int Palindromic(const string &str, int i, int j) { size_t n = str.length(); int curLen = 0; while (i >= 0 && j < n && str[i] == str[j]) {--i; ++j; } curLen = (j-1) - (i+1) + 1; return curLen; }};
- LeetCode: Longest Palindromic Substring
- LeetCode Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [Leetcode] Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Leetcode : Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- leetcode Longest Palindromic Substring
- LeetCode-Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Longest Palindromic Substring leetcode
- LeetCode Longest Palindromic Substring
- LeetCode - Longest Palindromic Substring
- LeetCode -- Longest Palindromic Substring
- LeetCode | Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- leetcode Longest Palindromic Substring
- 实现字符串(char*)的前N个字符放到后面
- Accessing static Data and Functions in Legacy C
- Java从0单排(2)-连接MYSQL 数据库的连接步骤
- 九 redis学习笔记之虚拟内存
- 关于strust2中的输入校验实例解析
- [LeetCode]Longest Palindromic Substring
- 2013年上半年CSDN精华0分下载资源
- Java对URL和URI的区分
- IE7 绝对定位z-index 层级问题
- jpgraph的中文乱码
- notepad++ 去除 重复行
- c# 以类名为参创建父类相同的类的实例
- C#连接Mysql数据库
- 得到连接的2个方法