一、最长公共子串
动态规划法
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
示例1
输入:
"1AB2345CD","12345EF"
返回值:
"2345"
class Solution {
public:
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
string LCS(string str1, string str2) {
// write code here
vector<vector<int> > dp(str1.size()+1,vector<int>(str2.size()+1,0));
int Max=0,end=0;
string str;
for(int i=1;i<=str1.size();i++)
{
for(int j=1;j<=str2.size();j++)
{
if(str1[i-1]==str2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=0;
}
if(dp[i][j]>Max)
{
Max=dp[i][j];
end=i-1;
}
}
}
str=str1.substr(end-Max+1,Max);
return str;
}
};
二、子数组最大累加和
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int getmax(int a,int b)
{
return a>b?a:b;
}
int maxsumofSubarray(vector<int>& arr) {
// write code here
int max=arr[0];
int sum=arr[0];
for(int i=1;i<arr.size();i++)
{
sum=getmax(sum+arr[i],arr[i]);
if(sum>max)
{
max=sum;
}
}
return max;
}
};
三、最长回文子串
使用中心扩散法
class Solution {
public:
int getLongestPalindrome(string A, int n) {
// write code here
int len=n;
int length=0;
int l,r;
for(int i=0;i<len;i++)
{
l=i;
r=i;
while(l>=0&&r<len&&A[l]==A[r])
{
length=max(length,r-l+1);
l--;
r++;
}
l=i;
r=i+1;
while(l>=0&&r<len&&A[l]==A[r])
{
length=max(length,r-l+1);
l--;
r++;
}
}
return length;
}
};