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

时间:2014-02-27 22:13:36

标签: java string recursion count character

我正在制作一个程序来计算在字符串中找到字符的次数。这就是我的方法:

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.但我需要声明该变量以使该方法起作用。我无法解决这个问题。任何帮助将不胜感激。

7 个答案:

答案 0 :(得分:4)

您在增加charOccurence后立即忽略了它。

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

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

  • 基本情况:
    • 第一个字符不存在(长度为零)
      • return 0;
  • 递归案例:
    • 第一个角色确实存在
      • 如果匹配,则增加出现次数
      • 别无所事
      • return(出现次数)+(使用子字符串递归的结果);

答案 1 :(得分:2)

是的,递归地执行它很容易:)

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)

答案 2 :(得分:2)

这是一种为递归方法编写递归方法的一般方法,这些方法实际上不应该是递归的,但必须是因为你正在学习类中的递归:

找到一种方法将问题分解为更小的问题。

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

对于此问题,您的解决方案不应该包含循环。

答案 3 :(得分:1)

你实际上从未增加计数。你只是继续回头数。在递归堆栈的最后,count将返回0,因为这是在每次方法调用开始时初始化count的内容,并且它将一直返回零,直到它到达堆栈的底部,然后返回0。你需要这样做:

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

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

答案 4 :(得分:0)

尽管递归不需要它(让我们这样做是为了好玩)。你差不多完成了。请确保有一个停止递归的条件:这里是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 :(得分:0)

我认为你做得比它需要的要难得多吗?

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

答案 6 :(得分:0)

我遇到了同样的问题,你总是可以做到这一点。

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)

} 

另一种方法是递归方法, 并重复您的代码,现在已经定义了计数,您可以递增而不会出现任何问题! :)