avatar
p*2
1
一个String有sub string 和 sub sequence.
sub string大家都知道,sub sequence就是可以不连续的sub string。
比如abc, ab, bc 都是substring, 而ac不是。但是,ac也是sub sequence。
现在给两个String, s和t
那么在s里选取一个substring, 在t里选取一个sub sequence,使得他们相等。
问可以选取多少种组合。sub string , sub sequence 内容相等不要紧,只要有字符的
位置不同就认为是不同的string。
比如
s: "aa"
t: "aa"
ans: 5
avatar
s*n
2
很难,面试遇到就投降了
avatar
g*e
3
暴力数?
avatar
p*2
4

暴力不行。这是到DP题。代码量很少。

【在 g*********e 的大作中提到】
: 暴力数?
avatar
l*e
5
用DP, 复杂度n3
avatar
a*g
6
n^2吧

【在 l******e 的大作中提到】
: 用DP, 复杂度n3
avatar
p*2
7

大牛给讲一讲。

【在 a***g 的大作中提到】
: n^2吧
avatar
z*c
8
我的想法
F[i][j]为S的substring最后取得位置是i,T的sub sequence最后取得位置是j,匹配的
方案数
1. S[i]!=T[j],则F[i][j]=0
2. S[i]==T[j],则
a. i和j分别都是各自的第一个字符,方案数1
b. i和j不是第一个字符,那么方案数F[i - 1][k] k < j
so
F[i][j] = 1 + sum (F[i - 1][1] + F[i - 1][2] .. F[i][j - 1])

S[i][j] = F[i][1] + F[i][2] + ... F[i][j]
所以
F[i][j] = 1 + S[i - 1][j - 1]
S[i][j] = S[i][j - 1] + F[i][j]
answer = sigma (F[i][j]), i <= len (s), j <= len(t)

【在 a***g 的大作中提到】
: n^2吧
avatar
p*2
9

你这么牛还需要多准备一个星期面F吗?

【在 z********c 的大作中提到】
: 我的想法
: F[i][j]为S的substring最后取得位置是i,T的sub sequence最后取得位置是j,匹配的
: 方案数
: 1. S[i]!=T[j],则F[i][j]=0
: 2. S[i]==T[j],则
: a. i和j分别都是各自的第一个字符,方案数1
: b. i和j不是第一个字符,那么方案数F[i - 1][k] k < j
: so
: F[i][j] = 1 + sum (F[i - 1][1] + F[i - 1][2] .. F[i][j - 1])
: 设

avatar
z*c
10
您搞笑了,刚才的G电面就跟坨屎一样。。。

【在 p*****2 的大作中提到】
:
: 你这么牛还需要多准备一个星期面F吗?

avatar
h*6
11
楼主你的F面完了吗,我刚去了估计没戏。
avatar
i*e
12
应该不会吧,以你的实力来看的话。

【在 h**6 的大作中提到】
: 楼主你的F面完了吗,我刚去了估计没戏。
avatar
a*g
13
M[i, j]: 以s[i]为结束的substring匹配t[0-j]的方案数
case 1: s[i] == t[j]
M[i, j] = M[i-1, j-1] + M[i, j-1] + 1
case 2: s[i] != t[j]
M[i, j] = M[i, j-1]
最后结果为: M[0, n-1] + M[1, n-1] + ... + M[n-1, n-1]
对么?

【在 a***g 的大作中提到】
: n^2吧
avatar
p*2
14

这题对我来说太复杂了。看了你的解释才有点头绪。晚上在好好看看。

【在 z********c 的大作中提到】
: 我的想法
: F[i][j]为S的substring最后取得位置是i,T的sub sequence最后取得位置是j,匹配的
: 方案数
: 1. S[i]!=T[j],则F[i][j]=0
: 2. S[i]==T[j],则
: a. i和j分别都是各自的第一个字符,方案数1
: b. i和j不是第一个字符,那么方案数F[i - 1][k] k < j
: so
: F[i][j] = 1 + sum (F[i - 1][1] + F[i - 1][2] .. F[i][j - 1])
: 设

avatar
b*e
15
This seems to be O(n^3). I believe there's O(n^2).

【在 z********c 的大作中提到】
: 我的想法
: F[i][j]为S的substring最后取得位置是i,T的sub sequence最后取得位置是j,匹配的
: 方案数
: 1. S[i]!=T[j],则F[i][j]=0
: 2. S[i]==T[j],则
: a. i和j分别都是各自的第一个字符,方案数1
: b. i和j不是第一个字符,那么方案数F[i - 1][k] k < j
: so
: F[i][j] = 1 + sum (F[i - 1][1] + F[i - 1][2] .. F[i][j - 1])
: 设

avatar
S*t
16
Arxor?

【在 z********c 的大作中提到】
: 您搞笑了,刚才的G电面就跟坨屎一样。。。
avatar
p*2
17
费了老半天劲写了一个恶心的。
int[][] dp = new int[2][];
void run()
{
Scanner in = new Scanner(System.in);
out = new PrintWriter(System.out);
char[] s = in.next().toCharArray();
char[] t = in.next().toCharArray();
int slen = s.length;
int tlen = t.length;
int mod = 1000000007;
dp[0] = new int[tlen];
dp[1] = new int[tlen];
int total = 0;
for (int j = 0; j < tlen; j++)
{
if (s[0] == t[j])
{
total++;
dp[0][j] = 1;
}
}
for (int i = 1; i < slen; i++)
{
if (s[i] == t[0])
{
dp[1][0] = 1;
total++;
}
int sum = 0;
for (int j = 1; j < tlen; j++)
{
sum += dp[0][j - 1];
sum %= mod;
if (s[i] == t[j])
{
dp[1][j] = sum + 1;
total += sum + 1;
total %= mod;
}
}
int[] tmp = dp[0];
dp[0] = dp[1];
dp[1] = tmp;
Arrays.fill(dp[1], 0);
}
out.println(total);
out.close();
}
avatar
l*i
18
The original problem is from codeforces.com, VK cup round 2, problem A. The
constraints ask for O(n^2) solution as n=5000.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。