递归计算字符串中的字符出现次数

Posted

技术标签:

【中文标题】递归计算字符串中的字符出现次数【英文标题】:Recursively counting character occurrences in a string 【发布时间】:2014-03-31 15:49:41 【问题描述】:

我正在编写一个程序来计算一个字符在字符串中出现的次数。这是我的方法的样子:

public static int count (String line, char c)

    int charOccurences = 0; //= 0;

    for (int x = 0 ; x < line.length () ; x++)
    
        if (line.charAt (x) == c)
        
            charOccurences++;
            line = line.substring (0, x) + line.substring (x + 1);
            return count (line, c);
        
        else
            return charOccurences;
    
    return charOccurences;

它总是返回 0,因为一旦方法调用自身,它会将 charOccurences 设置回 0。但我需要声明该变量才能使方法工作。我想不出任何办法。任何帮助将不胜感激。

【问题讨论】:

一个问题是你的 for 循环中的 else 。另外,您为什么要递归执行此操作,只需遍历原始字符串即可。一个简单的就够了。 主要问题是每次方法重复时我都将 charOccurences 设置为 0。如果不这样做,我想不出办法。我的老师也告诉我们让它递归。 那么您可能不必使用循环。使用递归或循环,但不能同时使用。 在 if 应该是 return charOccurrences+=count(line,c);返回字符出现;显然还有其他问题 【参考方案1】:

您在增加 charOccurences 后立即忽略它。

charOccurences++;
line = line.substring (0, x) + line.substring (x + 1);
return charOccurences + count (line, c); // Fixed for you.

其他人提到您根本不需要 for 循环。如果您想纯粹以递归方式执行此操作,则只需丢失循环,然后按照以下步骤操作:

基本情况: 第一个字符不存在(长度为零) return 0; 递归案例: 第一个字符确实存在 如果匹配,则增加出现次数 否则什么都不做 return(出现次数)+(用子串递归的结果);

【讨论】:

谢谢。不敢相信我错过了:p @Noob 已编辑答案以显示您如何完全失去循环。您的代码在技术上仍然是正确的,但它是从字符串的前面开始每次递归,这是很多额外的工作。【参考方案2】:

你永远不会真正增加计数。你只是不断返回计数。在递归堆栈的最后,count 将返回 0,因为这是您在每个方法调用开始时初始化 count 的值,并且它将一直返回零,直到它到达堆栈底部,然后返回 0。你需要这样做:

charOccurences += count (line, c);
return charOccurences;

所以 charOccurences 将在第一次出现时从 1 开始,然后向上传播。

【讨论】:

【参考方案3】:

是的,递归很容易:)

public static void main(String[] args) 
    String text = "This is my text. Life is great";
    System.out.println(count(text,'i',0));


public static int count(String line, char c, int pos) 
    if (pos >= line.length())
        return 0;
    

    return compare(line.charAt(pos), c) + count(line, c, pos+1);


public static int compare(char a, char b)
    if (a == b)
        return 1;
     else 
        return 0;
    

请注意,由于不是每次都进行子串化,时间复杂度是 O(n) 而不是你的 O(n^2)

【讨论】:

【参考方案4】:

尽管递归地执行它不是必需的(让我们这样做是为了好玩)。你快完成了。只要确保有一个停止递归的条件:这里是if (len == 0)… 语句。

public static int count (String line, char c)

    int len = line.length();
    if ((len == 0) || (c == '\0'))   // obvious case for empty string or nil char.
       return 0;                     // Your recursion always ends here

    String rest = line.substring(1);
    if (line.charAt(0) == c)     
    
       return count(rest, c) + 1;   // recurse on substring
    
    else
    
       return count(rest, c);   // recurse on substring
    

【讨论】:

【参考方案5】:

以下是为确实不应该递归但必须递归的任务编写递归方法的一般方法,因为您正在课堂上学习递归:

想办法把问题分解成更小的问题。

在这里,您的问题是计算字符串中字符 c 的出现次数。好吧,假设您将字符串分解为“第一个字符”和“所有其他字符”的子字符串。您可以判断第一个字符是否等于c。然后您查看“所有其他字符”,如果它不是空的(基本情况),那么这只是同一问题的较小版本。所以你可以使用递归。所以假设递归已经发生,那么你知道:(1)是第一个字符等于c,以及(2)c 在较小的字符串中有多少次出现。一旦你知道了这两条数据,你应该能够计算出整个字符串中有多少个c

对于这个问题,您的解决方案中不应包含循环。

【讨论】:

【参考方案6】:

我认为你让它变得比需要的更难?

public static int count(String line, char c) 
    int orig = line.length();
    int repl = line.replaceAll("" + c, "").length();
    return orig - repl;

【讨论】:

我需要它是递归的。 “做我的功课!”不是原始帖子的一部分。 这实际上是一个非常优雅的解决方案,只是不是递归的。【参考方案7】:

我有同样的问题,你总是可以这样做我在一个词上做了同样适用于一个句子

private static int count(String word, String letter) 
    int count = 0;
 return occurrence(word, letter, count);


private static int occurrence(String word, String letter, int count) 
if () 
base case 
else 
// compare and increment if it matches..
return occurrence(word.substring(0, word.length() - 1), letter,count)

 

另一种方法是递归方法, 并重复您的代码,现在计数已经定义,您可以毫无问题地增加! :)

【讨论】:

【参考方案8】:

请删除 for 循环内的 else 循环。如果你保持那个循环,你应该只会出现一个字符。

public static int count (String line, char c)

    int charOccurences = 0; //= 0;

    for (int x = 0 ; x < line.length () ; x++)
    
        if (line.charAt (x) == c)
        
            charOccurences++;
            line = line.substring (0, x) + line.substring (x + 1);
            return count (line, c);
        
    
    return charOccurences;

【讨论】:

嗨 Vishwajit,如果问题已经有已接受的答案,则通常无需再次回答。特别是,如果这个问题是多年前提出并回答的。如果想回答新问题,请查看here。

以上是关于递归计算字符串中的字符出现次数的主要内容,如果未能解决你的问题,请参考以下文章

递归计算嵌套数字列表中的出现次数

每日一题 | day23(微信红包 | 计算字符串的距离)

使用 sqlite 递归计算出现次数

递归计算JAVA中字符串中的字符

Prolog中的指令顺序和递归

如何处理java中的递归Stack Overflows