算法第四次作业
来源:互联网 发布:微信整蛊软件 编辑:程序博客网 时间:2024/06/05 07:25
Longest Palindromic Substring
Description:
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”
解题思路:
首先想到两种方法都是枚举思想,第一种是对于每个子串的中心往两边扫,不断更新最长回文串;第二种是动态规划,通过维护一个二维bool数组,遍历所有字符,进行判断。
第一种中心有2*n-1个,字符有n个,间隙有n-1个。
class Solution {public: string longestPalindrome(string s) { if(s.empty()) return ""; int left=0; int right=0; int maxlen=0; string res,str; for(int i=0;i<2*s.length()-1;i++) { left=i/2; right=i/2; if(i%2==1) right++; str=longest(left,right,s); if(maxlen<str.length()) { maxlen=str.length(); res=str; } } return res; }private: string longest(int left,int right,string s){ while(s[left]==s[right]&&left>=0&&right<=s.length()) { left--; right++; } return s.substr(left+1,right-left-1); } };
第二种方法中
if(s.charAt(i)==s.charAt(j) && (j-i<=2 || palin[i+1][j-1])) 是核心,不断更新palin[i][j],如果palin[i+1][j-1]是true那么对它的外层进行判断;j-i<=2说明它要么是以一个字符或者间隙为核心的回文串,要么是单个的字符或间隙。
class Solution {public: string longestPalindrome(string s) { if(s.empty()) return ""; string res=""; int maxlen=0; bool judge[s.length()][s.length()]={0}; for(int i=0;i<s.length();i++) { for(int j=i;j>=0;j--) { if(s[i]==s[j]&&(i-j<=2||judge[j+1][i-1])) { judge[j][i]=true; if(i-j+1>maxlen) { maxlen=i-j+1; res=s.substr(j,i-j+1); } } } } return res; }};
以上复杂度都是O(n^2),还有一种Manacher’s Algorithm很厉害,能够做到线性,这个比较复杂,有兴趣的同学可以自行查阅
阅读全文
0 0
- 算法第四次作业
- 算法与数据结构第四次作业 队列
- 第四次作业 LBG矢量量化算法
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业哦~~~~
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次作业
- 第四次课后作业
- 第四次作业
- static 关键字的使用
- 【R笔记】R机器学习(五)——决策树ID3算法
- 交叉熵(Cross Entropy)
- 声音识别的 ImageNet 诞生了
- JavaScript sort() 方法
- 算法第四次作业
- java基础2017-10-01
- 旋转数组(循环数组)的最小数字
- Matlab图像处理-亮度(灰度)变换问题
- select用法
- 终于找到不走全局proxy方案
- The C Programming Language 练习题2-4
- Shell脚本8种字符串截取方法总结
- [简单题]Human Readable Time(Python 实现)