这可以仅通过递归来完成吗?

tot*_*oto 1 java recursion

我被困在这个 CodingBat递归问题上:

给定一个字符串,递归返回一个"已清理"的字符串,其中相同的相同字符已减少为单个字符.所以"yyzzza"会产生"yza".

stringClean("yyzzza") ? "yza"
stringClean("abbbcdd") ? "abcd"
stringClean("Hello") ? "Helo"
Run Code Online (Sandbox Code Playgroud)

我可以使用循环来解决它,但这是不允许的,因为问题应该是使用递归来解决的.有没有办法解决这个问题而不使用循环并只使用递归?没有全局变量,没有循环.我甚至想过在参数中编码一些信息,但我认为这也是作弊.

我之前的程序没有while循环,我只能得到一半的答案.基本上,当我使用字符串参数调用我的函数时,我检查了前2个字符.如果它们是相同的,我将返回该字符并再次使用两个字符小的字符串调用该函数.但是,相同连续字符中的3个或4个字符串总是会使我的算法失败.

public String stringClean(String str) {

    if (str.length() == 0)
        return "";

    if (str.length() > 1) {

    int counter = 1;


      char a = str.charAt(0);
      char b = str.charAt(1);

       if (a == b)
       {
          while (str.length() > 1)
          {
             a = str.charAt(0);
             b = str.charAt(1);

             if (a != b) break;

             counter++;
             str = str.substring(1);


          }

           return a + stringClean( str.substring(1) ) ;
       }

    }

    return str.charAt(0) + stringClean (str.substring(1) );

}
Run Code Online (Sandbox Code Playgroud)

Yog*_*ngh 6

我的问题是以下,有没有办法解决这个问题,而不使用循环和仅使用递归.没有全局变量,没有循环.

答:是的.这很简单.试试以下:

 public String stringClean(String str) {
      if (str.length() == 0)
            return "";
      if (str.length() == 1)
            return str;

      if(str.charAt(0) == str.charAt(1)){
         return stringClean(str.substring(1));   
      }else{
        return str.charAt(0)+ stringClean(str.substring(1));
      }    
    }
Run Code Online (Sandbox Code Playgroud)

您的CodingBat结果如下:

stringClean( "yyzzza")→ "YZA" "YZA" OK
stringClean( "abbbcdd")→ "ABCD", "ABCD" OK
stringClean( "你好")→ "直升机", "直升机" OK
stringClean( "XXabcYY")→" XabcY" "XabcY" OK
stringClean( "112ab445")→ "12ab45" "12ab45" OK
stringClean( "你好簿记员")→ "直升机Bokeper" "直升机Bokeper" OK
等检查 确定