【问题标题】:Finding a String in another String Using Recursion Mechanism in Core Java在 Core Java 中使用递归机制在另一个字符串中查找一个字符串
【发布时间】:2011-05-30 15:34:58
【问题描述】:

我有以下问题陈述

PS:给定一个字符串“str”和一个非空子字符串“sub”,如果“sub”的至少“N”个副本出现在“某处”中,则计算“递归”,可能带有“重叠”。 N 将是非负数。

Example are as shown below
strCopies("catcowcat", "cat", 2) → true
strCopies("catcowcat", "cow", 2) → false
strCopies("catcowcat", "cow", 1) → true
strCopies("iiijjj", "ii", 2) → true

我已经编写了如下所示的代码(没有递归),并且在少数测试用例中运行良好,除了标记为 FAIL 的其他测试用例。

:::代码如下图:::

public boolean strCopies(String str, String sub, int n) {    
    int len = sub.length();    
    int result=0;    
    if(len>0){    
       int start = str.indexOf(sub);    
       while(start !=-1){    
              result++;    
              start = str.indexOf(sub,start+len);                     
       }
    }          
   if(result==n){
        return true;
   }else return false; 
}

运行上述代码如下所示(用粗体标记为失败的测试用例)

Expected This Run
strCopies("catcowcat", "cat", 2) → true true OK
strCopies("catcowcat", "cow", 2) → false false OK
strCopies("catcowcat", "cow", 1) → true true OK
strCopies("iiijjj", "ii", 2) → true false FAIL
strCopies("iiiiij", "iii", 3) → true false FAIL
strCopies("ijiiiiij", "iiii", 2) → true false FAIL

您能否检查并告诉我 FAIL TEST CASES 的代码有什么问题?我无法考虑重叠场景。

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    嗯,您的第一个问题是您的方法不是递归的。我怀疑你想和substring 以及indexOf 一起工作...

    至于你当前的方法为什么不起作用,我怀疑是因为你使用start + len而不是start + 1来寻找下一个起始位置。因此,当试图在“iii”中找到“ii”时,您应该首先查看位置 0,然后查看位置 1 - 目前您正在查看位置 2,这意味着它不会找到从 1 开始的第二个“ii” .

    【讨论】:

    • 程序需要什么修复才能适用于 FAIL 测试用例。
    • @Deepak:我不只是要给你代码,因为这显然是一个家庭作业(而且与数组无关 - 我不确定你为什么以这种方式标记它)。我已经解释了您当前代码的问题,并建议您应该按照说明使用递归。如果您无法理解我所写的内容,请说出来——但我不会只为您做作业。这对任何人都没有帮助。
    【解决方案2】:

    首先,您的解决方案不是递归的(strCopies 不会调用自身)。

    以下是您算法的递归版本的建议:

    public static boolean strCopies(String str, String sub, int n) {
        if (str.isEmpty())
            return n == 0;
        int remainingN = str.startsWith(sub) ? n - 1 : n;
        return strCopies(str.substring(1), sub, remainingN);
    }
    

    (All your test-cases pass.)


    顺便说一句,请注意您的最后几行代码:

    if(result==n)
        return true;
    else
        return false; 
    

    总是可以简单地替换

    return result == n;
    

    【讨论】:

      【解决方案3】:
      public class StackOverflow {
      
       public static void main(String[] args) {
        String string = "catcowcat";
        String substring = "cat";
        System.out.println(string + " has " + findNumberOfStrings(string, substring, 0) + " " + substring);
       }
      
       private static int findNumberOfStrings(String string, String substring, int count){
        if (string.length() == 0){
         return count + 0;
        }
        if (string.length() < substring.length()){
         return count + 0;
        }
        if (string.contains(substring)){
         count++;
         string = string.replaceFirst(substring, "");
         return findNumberOfStrings(string, substring, count);
        }
        return count;
       }
      
      }
      

      【讨论】:

        【解决方案4】:

        问题的纯递归代码是:

        public boolean strCopies(String str, String sub, int n) {
           if(n==0) return true;
           if(str.length()==0) return false;
           if(str.length()<sub.length()) return false;
           if(str.startsWith(sub)) return strCount(str.substring(1),sub, n, 1);
           return strCopies(str.substring(1),sub,n);
        }
        
        public boolean strCount(String str , String sub , int n , int count ) {
           if( count>= n) return true;
           if(str.length()==0) return false;
           if(str.length()<sub.length()) return false;
           if(str.startsWith(sub)) {
           count++;
           if( count>= n) return true;
           }
           return strCount(str.substring(1),sub, n , count );
        }
        

        我们必须维护 str 字符串中 sub 的出现次数。但是在 strCopies 函数的递归调用中,如果我们取 count 变量,每次调用函数时 var count 的值都会重新初始化(我们不能在函数的内存中维护 count 并且不能继续添加到它之前的值)。因此,为了维护 count 的值,我们将 count 的值传递给另一个函数 strCount(如return strCount(str.substring(1), sub, n, count ) ),它也可以递归工作并且可以执行 count++,因为它仅使用 count 值调用,并且 count 不会被重新初始化,而是被结转.

        【讨论】:

          【解决方案5】:

          基本思想是搜索子词的索引,然后发送新字符串,该字符串在您找到该词的索引后一个字符开始,因为您允许重叠。

          public boolean strCopies(String str, String sub, int n) {
          
           if (str == null || str.equals("") || str.length() < sub.length())
            if (n == 0)
              return true;
            else 
              return false;
          
          
           int index =  str.indexOf(sub);
           if (index != -1)
            return false || strCopies(str.substring(index + 1),sub,--n);
           else
            return false || strCopies("",sub,n);
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-25
            • 2021-01-22
            • 2022-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-25
            相关资源
            最近更新 更多