【发布时间】:2016-11-26 22:27:27
【问题描述】:
我正在尝试构建一个 递归 算法,该算法从诸如“xxxzzppp”之类的字符串开始,只有在同一字符的每个序列(连续子字符串)由以下组成时才会返回 true与后面的字符相比,小于或等于字符,直到结束。
假设一个字符串是按字母顺序排列的。
否则它将返回0。
例子:
xxppp = 1; // by = I mean that it should return that value when given to the function
xxxp = 0;
nnnpppz = 0;
npz = 1;
npp = 1;
llleeeegggg = 1;
我试过这个:
int CheckOcc(char seq[]) {
int j = 0, counter = 0;
if (strlen(seq) == 0)
return 100; //last is always shorter than nothing
for (j = 0; j < strlen(seq); j++)
if (seq[0] == seq[j])
counter++;
if (counter <= CheckOcc(seq + j))
return counter;
else
return 0;
}
但我就是不能让它工作,有人可以给点建议吗?我已经解决了两个小时,只是想不通。
编辑:
请注意,通过传递 seq + j,我实际上是从刚刚结束的子字符串之后的第一个子字符串开始传递搅拌。指针代数是正确的,我就是想不通算法,特别是不知道返回是什么。非常感谢任何帮助。
【问题讨论】:
-
对不起@chux,我在删除无用部分时写了 count 而不是 counter。现在修好了。代码直接从 main 提供字符串到 CheckOcc(),它们是有效的,算法不起作用。
-
嗯,你想要
CheckOcc(seq + counter)吗? -
我希望 CheckOcc 返回 1(或任何正值),给定一个字符串,如果该字符串由相同字符的子字符串组成,并且永远不会比紧随其后的子字符串长。否则为 0。请看很难解释的例子。还请理所当然地认为字符串是正确的。 seq + counter 是将第一个序列的计数与第二个序列的计数进行比较,依此类推。 j 通过指针代数指向序列停止的位置和新序列的开始位置。这是我想出的最好的..
-
npz = 1;为什么是真的? -
@BLUEPIXY 因为没有比它前面的序列更短的序列。 n = 长度为 1 的序列。它是否更短或等于下一个? (p,长度 1)。是的,这样下去,它会返回 1。
标签: c++ c arrays algorithm recursion