【问题标题】:Recursive algorithm for substrings of the same character in CC中相同字符的子字符串的递归算法
【发布时间】: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


【解决方案1】:

试试这个

#include <stdio.h>
#include <limits.h>

int CheckOcc(char seq[]) {
    int j = 0, counter = 0;

    if (!*seq) return INT_MAX;

    for (j = 0; seq[j] && *seq == seq[j]; j++)
        counter++;

    return (counter <= CheckOcc(seq + j)) ? counter : 0;
}
int main(void){
    char input[128];
    while(1 == scanf("%127[^\n]%*c", input)){
        if(CheckOcc(input))
            printf("%s = 1\n", input);
        else
            printf("%s = 0\n", input);
    }
    return 0;
}

【讨论】:

  • 嗨,你的例子确实有效,谢谢,你真的很聪明。但是通过观察它,我看到了我自己的思维过程,我看不出有什么不同。我也为您的演示使用了自己的主要功能,所以这不是问题。我做错了什么?编辑-另一条评论帮助我找到了答案。我增加了 j 太多,我应该在 for 循环中添加另一个条件,非常感谢先生。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 2015-06-09
  • 2022-01-09
  • 2015-03-12
  • 1970-01-01
  • 2020-06-07
  • 2020-03-15
  • 2017-04-24
相关资源
最近更新 更多