练习"不同的子序列"在线:
给定一个字符串S和一个字符串T,计算S中T的不同子序列的数量。
字符串的子序列是一个新字符串,它是由原始字符串形成的,删除一些(可以是无)字符,而不会干扰其余字符的相对位置。 (即" ACE"是" ABCDE"" AEC"不是)的子序列。
这是一个例子:
S =" rabbbit",T ="兔子"返回3.
我的代码如下所示。
对于测试用例{s="aaaaaaaaaaaaa", t="aa"}
:
如果我在最终返回前启用//free(pMtx);
,我的代码将被视为失败,结果为79
。
如果我将此free(pMtx);
注释掉,我的结果是正确的78
。
然后我尝试在我的本地PC上启用free(pMtx);
一切正常。
因此,我真的很困惑为什么会这样?
int numDistinct(char* s, char* t) {
int slen=strlen(s);
int tlen=strlen(t);
if( (0 == slen) || (0 == tlen)||(tlen>slen))
return 0;
int* pMtx = (int*)malloc(slen*tlen*sizeof(int));
for(int ss=0; ss<slen; ss++)
{
if(0==ss)
{
pMtx[0] = (s[0]==t[0]) ? 1 : 0;
continue;
}
for(int tt=0; tt<tlen; tt++)
{
int cur = ss*tlen + tt;
if(tt>ss)
{
pMtx[cur]=0;
continue;
}
int v1 = (tt==0) ? 1 : pMtx[cur-tlen-1];
int vv = v1 + pMtx[cur-tlen];
if(s[ss]==t[tt])
pMtx[cur] = (vv>=pMtx[cur-tlen]) ? vv : pMtx[cur-tlen];
else
pMtx[cur] = pMtx[cur-tlen];
}
}
int rst = pMtx[slen*tlen-1];
//free(pMtx); //------------> open it will result in wrong rst value ???
return rst;
}
答案 0 :(得分:3)
问题在于:
pMtx[0]
您需要将pMtx[tlen-1]
初始化为import matplotlib.pyplot as plt
plt.plot([8.714871428, 8.618221961,8.338674976,7.904714805,6.73505356,6.08059523,5.423472376,4.785585409,3.615895343])
plt.ylabel(r'$\frac{\kappa}{C} \rho$')
plt.show()
,而不仅仅是第一个元素。
第一次分配内存时,通常会将其清零(因为操作系统可能在将其提供给进程之前已完成)。当你释放内存时,它可以在你下次分配内存时重用,然后它就不会再为零了。因此,如果您从main调用此函数不止一次,它就会解释它失败的原因。