【问题标题】:a recursive java program to find all substring in a string [duplicate]一个递归java程序来查找字符串中的所有子字符串[重复]
【发布时间】:2016-10-18 14:03:29
【问题描述】:

我试图找到一个字符串中的所有子字符串,我编写了以下代码,但我有一些不需要的输出,如下所示: 该方法首先打印子字符串(0,1),然后它通过将b递增1来调用自身并继续这样,当b>字符串的长度时,它将预先增加a,并将a + 1传递给b,然后继续这个,直到a+1==字符串长度的最后一个子字符串,当我的递归程序应该终止时。

public static void main(String[] args) {
    recsub("java",0,1);
}

public static void recsub(String str,int a,int b){
    if(b>str.length()) {
        System.out.println();
        recsub(str,++a,a+1);
    }
    else {
        System.out.print(str.substring(a,b)+" "); 
    }
    if((a+1)==str.length()) {

    } 
    else {
        recsub(str,a,b+1);
    }

这段代码的输出是:

j ja jav java 
a av ava 
v va
a
a
v va
a
a 

或者我可以通过这个方法突破并返回到main,每当程序进入那个if(if(a+1)==...),就像打破一个循环一样?

【问题讨论】:

    标签: java recursion substring


    【解决方案1】:

    如果你的逻辑结构很好,你不应该打破这样的例程,尽管根据需要返回是非常合法的(并且通常很有用)。

    错误在于您的第二次递归:这应该以子字符串大小 b 足够短为条件。

    我冒昧地替换了一个字母的变量名(a -> start_pos,b -> size),更改了测试字符串(“java”有两个 a,所以更难跟踪),并清理空白。

    public class substr {
      public static void main(String[] args) {
        recsub("abcd", 0, 1);
      }
    
      public static void recsub(String str, int start_pos, int size){
        if (size > str.length()) {
          // Print newline; restart with next character
          System.out.println();
          recsub(str, ++start_pos, start_pos+1);
        }
        else {
          // Print one substring
          System.out.print(str.substring(start_pos, size)+" ");
          if (start_pos+1 < str.length()) {
            recsub(str, start_pos, size+1);
          }
        }
      }
    }
    

    输出:

    a ab abc abcd 
    b bc bcd 
    c cd 
    d 
    

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 2019-03-29
      • 2014-02-19
      • 2012-04-20
      • 2017-08-05
      • 1970-01-01
      • 2012-09-19
      • 2011-05-26
      相关资源
      最近更新 更多