最短的子序列。
Gary有两个字符串S和V。现在Gary想知道S中的长度最短的子序列,以使其不是V中的子序列。
样本输入: babbab 巴巴 样本输出: 3
我尝试实现递归dp。我不想重复做。 我看过各种网站,但没有一个使用dp的递归解决方案。我想知道如果我以迭代方式而不是递归dp进行操作,那么时间复杂度会有什么不同。
#include <bits/stdc++.h>
using namespace std;
int helper(string s, string v, int m, int n, int ** dp)
{
if(m == 0)
{
return 1002;
}
if(n <= 0)
{
return 1;
}
int k; int ans;
for(k = 0; k < n; k++)
{
if(s[0] == v[k])
{
break;
}
}
if(k == n)
{
return 1;
}
if(dp[m][n] != -1)
{
return dp[m][n];
}
ans = min(helper(s.substr(1), v, m - 1, n, dp), 1 + helper(s.substr(1), v.substr(k + 1), m - 1, n - k - 1, dp));
dp[m][n] = ans;
return ans;
}
int solve(string s,string v)
{
int m = s.length();
int n = v.length();
int ** dp = new int *[m + 1];
for(int i = 0; i <= m; i++)
{
dp[i] = new int[n + 1];
for(int j = 0; j <= n; j++)
{
dp[i][j] = -1;
}
}
int ans = helper(s, v, m, n, dp);
for(int i = 0; i <= m; i++)
{
delete[] dp[i];
}
delete[] dp;
return ans;
}
超出获取时间限制。