//最长子序列
int longestPalindromeSubseq(string s) {
int size = s.size();
vector<vector<int>> dp(size,vector<int>(size,0));
for(int i=0;i<size;i++)
dp[i][i]=1;
for(int len=1;len<=size;len++)
{
for(int i=0;i+len<size;i++)
{
int j = i+len;
if(s[i]==s[j])
{
dp[i][j]=dp[i+1][j-1]+2;
}
else
{
dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
}
}
}
return dp[0][size-1];
}
//最长回文子子串的两种实现方法,
//时间复杂度为O(N)
string longestPalindrome(string s) {
if(s.empty())
return "";
if (s.size() == 1)
return s;
int min_start = 0, max_len = 1;
for(int i = 0; i < s.size();)
{
if(s.size()-i<=max_len/2)
break;
int j = i, k = i;
while (k < s.size()-1 && s[k+1] == s[k])
++k; // Skip duplicate characters.
i = k+1;
while(k < s.size()-1 && j > 0 && s[k + 1] == s[j - 1])
{
++k;
--j;
} // Expand.
int new_len = k - j + 1;
if (new_len > max_len)
{
min_start = j;
max_len = new_len;
}
}
return s.substr(min_start, max_len);
}
//时间复杂度为O(n*n)
string longestPalindrome(string s) {
if(s.size()==0)
return "";
int maxlen=0;
string res="";
for(int i=0;i<2*s.size()-1;i++)
{
int left = i/2;
int righ = i/2;
if(i%2==1)
righ++;
string tmp = check(s,left,righ);
if(maxlen<=tmp.size())
{
maxlen = tmp.size();
res = tmp;
}
}
return res;
}
string check(string s,int left,int righ)
{
while(left>=0 && righ<s.size() && s[left]==s[righ])
{
left--;
righ++;
}
return s.substr(left+1,righ-left-1);
}
字符串的最长回文子序列以及最长子串
最新推荐文章于 2023-03-30 17:37:48 发布