如何递归计算字符串中某些特定字符的数量?

时间:2017-04-17 18:30:49

标签: java

我正在练习递归问题。有些类型的问题要求你计算String中没有循环的特定字符数。

我应该使用哪种方法?谁能向我解释一下?

这是一个问题:“给定一个字符串,递归计算(无循环)字符串中小写的'x'字符数。”

我的代码:

public int countX(String str) {
    if(str.length()==0){
        return 0;
    }
    if(str.charAt(0)=='x'){
        return 1+ countX(str.substring(1));
    }
    return countX(str);
} 

3 个答案:

答案 0 :(得分:3)

你几乎就在那里,但你需要修改str中第一个字母不是'x'的情况。您当前正在做的事情将导致无限递归,因为在str.charAt(0) != 'x'的情况下,您在countX上递归调用str。但是,str仍然是第一个字母没有'x'的字符串,因此它会一次又一次地在countX上调用str等等..所以解决方案是只在countX上调用str.substring(1),当它的第一个字母不是'x'时,

public int countX(String str) {
    if(str.length()==0){
        return 0;
    }
    if(str.charAt(0)=='x'){
        return 1 + countX(str.substring(1));
    }
    else{
        return countX(str.substring(1));
    }
} 

您的方法在

之前做了什么

假设我在countX上调用了"Hello",这里是调用堆栈跟踪的样子,

call countX("Hello")
"Hello".length() != 0 so we move on to the next condition
"Hello".charAt(0) != 'x' so we call countX("Hello")
    call countX("Hello")
    "Hello".length() != 0 so we move on to the next condition
    "Hello".charAt(0) != 'x' so we call countX("Hello")
        call countX("Hello")
        "Hello".length() != 0 so we move on to the next condition
        "Hello".charAt(0) != 'x' so we call countX("Hello");
            .
            .
            .
            infinite recursion

新解决方案的作用

call countX("Hello")
"Hello".length() != 0 so we move on to the next condition
"Hello".charAt(0) != 'x' so we call countX("ello")
    call countX("ello")
    "ello".length() != 0 so we move on to the next condition
    "ello".charAt(0) != 'x' so we call countX("llo")
        call countX("llo")
        "llo".length() != 0 so we move on to the next condition
        "llo".charAt(0) != 'x' so we call countX("lo");
            call countX("lo")
            "lo".length() != 0 so we move on to the next condition
            "lo".charAt(0) != 'x' so we call countX("o");
                call countX("o")
                "o".length() != 0 so we move on to the next condition
                "o".charAt(0) != 'x' so we call countX("");
                    call countX("")
                    "".length() == 0 so return 0
                return 0
            return 0
        return 0
    return 0
return 0

请注意,在解决方案中,我们始终可以找到基本案例(str.length()==0)。在此之前,会有一些情况(当我们遇到一封非x的字母时)会阻止该方法达到基本情况。

答案 1 :(得分:2)

  

我应该使用哪种方法?谁能向我解释一下?

一种解决方案是使用StringBuilder并在每次调用方法时删除第一个字符,最终,您将获得基本情况并输出正确的结果。

public int countX(String str) {
       if(str.length() == 0) return 0;

       StringBuilder builder = new StringBuilder(str);
       if(str.charAt(0) == 'x'){
           builder.deleteCharAt(0);
           return 1 + counter(builder.toString());
       }

       builder.deleteCharAt(0);
       return counter(builder.toString());   
 } 

但是,如果您希望继续使用当前的解决方案,则需要将其替换为:

return countX(str);

用这个:

return countX(str.substring(1));

问题在于,如果当前字符不是'x',您只是忽略它并且没有简化基本情况下的问题。

答案 2 :(得分:0)

我理解你的需要。在下面,您可以使用递归计算字符串中字符的方法。

 static int countCharRecursively(String str, char ch){

    if(str.indexOf(ch) != -1)
    {          
        return  countCharRecursively(str.substring(0, str.indexOf(ch)), ch)+ 
            countCharRecursively(str.substring(str.indexOf(ch)+1),ch) + 1;
    }
    else{
        return 0;
    }
}

这是一个可以运行的完整程序。

public class CountCharRecursivelyInString{

 public static void main(String[] args){

    String str = "hello the world"; 

    char ch = 'l';

    int nbr = countCharRecursively(str, ch);

    System.out.println(ch + " : " + nbr);
}

static int countCharRecursively(String str, char ch){

    if(str.indexOf(ch) != -1)
    {          
        return  countCharRecursively(str.substring(0, str.indexOf(ch)), ch)+ 
            countCharRecursively(str.substring(str.indexOf(ch)+1),ch) + 1;
    }
    else{
        return 0;
    }
 }
}