5.最长回文子串
题目链接
踩过的坑
暴力解法超时
class Solution {
public:
string longestPalindrome(string s) {
string result("");
int sSize = int(s.size());
for(int i=0;i<sSize;i++){
int maxLength=sSize-i;
for(int tmpSize= 1;tmpSize<=maxLength;tmpSize++){
string tmpStr= s.substr(i, tmpSize);
if(isPalindrome(tmpStr)&&tmpStr.size()>result.size()){
result=tmpStr;
}
}
}
return result;
}
bool isPalindrome(string s){
int left=0;
int right=int(s.size())-1;
for(;left<right;left++,right--){
if(s[left]!=s[right]){
return false;
}
}
return true;
}
};
AC代码
参考解答
方法一:反转字符串+动态规划
class Solution {
public:
string longestPalindrome(string s) {
if(s==""){
return "";
}
string result("");
int sSize = int(s.size());
string reverseS=s;
reverse(reverseS.begin(), reverseS.end());
vector<int> tmpVec(sSize, 0);
vector<vector<int >> store(sSize,tmpVec);
int maxLength = 0, end = 0;
for(int i=0;i<sSize;i++){
for(int j=0;j<sSize;j++){
if(s[i] == reverseS[j]){
if(i==0||j==0){
store[i][j]=1;
}
else{
store[i][j]=store[i-1][j-1]+1;
}
}
if(store[i][j]>maxLength){
int preJ=sSize-1-j;
int nowJ=preJ+store[i][j]-1;
if(nowJ==i){
end=i;
maxLength=store[i][j];
}
}
}
}
result = s.substr(end+1-maxLength, maxLength);
return result;
}
};
方法二:动态规划
class Solution {
public:
string longestPalindrome(string s) {
if(s==""){
return "";
}
string result("");
int sSize=int(s.size());
vector<bool> store(sSize, false);
int start=0,end=0, maxLen=0;
for(int j=0;j<sSize;j++){
for(int i=0;i<=j;i++){
store[i]=(s[i]==s[j]&&(j-i<3||store[i+1]));
if(store[i]&&(j-i+1)>maxLen){
maxLen=j-i+1;
start=i;
end=j;
}
}
}
result=s.substr(start, end-start+1);
return result;
}
};
方法三:中心扩展算法
方法四:马拉车算法
72. 编辑距离
编辑距离
题解
AC代码
class Solution {
public:
int minDistance(string word1, string word2) {
int n=word1.length();
int m=word2.length();
if(n*m==0) return n+m;
int D[n+1][m+1];
for(int i=0;i<n+1;i++){
D[i][0]=i;
}
for(int j=0;j<m+1;j++){
D[0][j]=j;
}
for(int i = 1;i< n+1;i++){
for(int j=1;j<m+1;j++){
int left=D[i-1][j]+1;
int down=D[i][j-1]+1;
int left_down=D[i-1][j-1];
if(word1[i-1]!=word2[j-1]){
left_down+=1;
}
D[i][j]=min(left, min(down, left_down));
}
}
return D[n][m];
}
};
198. 打家劫舍
题目链接
参考答案
动态规划
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty()){
return 0;
}
int size=nums.size();
if(size==1){
return nums[0];
}
vector<int > dp=vector<int >(size, 0);
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<size;i++){
dp[i]=max(dp[i-2]+nums[i], dp[i-1]);
}
return dp[size-1];
}
};
213. 打家劫舍 II
题目链接
分析
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==0){
return 0;
}
else if(n<4){
return (*max_element(nums.begin(),nums.end()));
}
int dp[n][2];
dp[0][0]=0;
dp[0][1]=nums[0];
dp[1][1]=nums[0];
dp[1][0]=nums[1];
for(int i=2;i<n;i++){
if(i!=n-1){
dp[i][0]=max(dp[i-1][0],dp[i-2][0]+nums[i]);
dp[i][1]=max(dp[i-1][1],dp[i-2][1]+nums[i]);
}
else{
dp[i][0]=max(dp[i-1][0],dp[i-2][0]+nums[i]);
dp[i][1]=dp[i-1][1];
}
}
return max(dp[n-1][0],dp[n-1][1]);
}
};
516. 最长回文子序列
题目链接
题解
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n=s.size();
vector<vector<int> > f(n, vector<int>(n, 0));
for(int i=0;i<n;i++) f[i][i]=1;
for(int len=2;len<=n;len++){
for(int i=0;i+len-1<n;i++){
int j=i+len-1;
if(s[i]==s[j]){
f[i][j]=2+f[i+1][j-1];
}
else{
f[i][j]=max(f[i+1][j],f[i][j-1]);
}
}
}
return f[0][n-1];
}
};
674. 最长连续递增序列
题目链接
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int n=nums.size();
int len=1,max=0;
if(n==0)
return 0;
else{
for(int i=1;i<n;i++){
if(nums[i]>nums[i-1]){
len++;
}
else{
if(len>max){
max=len;
}
len=1;
}
}
if(len>max) max=len;
return max;
}
}
};