使用递归在Java中编写序列程序

时间:2012-02-26 02:47:47

标签: java recursion sequences

我的任务是查找字符串的所有子序列的问题。

例如,如果字符串是“bat”,则子序列返回[,b,ba,at,bt,t]

注意它没有字符串的所有排列,因为它必须按顺序排列。第一个字符串是一个空字符串,显然需要说明。

另一个例子是字符串“brat”。预期的输出将是[,a,at,b,ba,bat,br,bra,brat,brt,bt,r,ra,rat,rt,t]

我已经尝试编写一个程序,它将使用递归并给我输出,但我只是到目前为止。我确定我理解递归,但我不知道如何编写这个问题。

这是我到目前为止所做的:

import java.util.ArrayList;
public class Sequences {
   public static ArrayList<String> sequences(String s) {
      ArrayList<String> list = new ArrayList<String>();      
      return subsequences(s, list);
   }
   public static ArrayList<String> sequences(String s, ArrayList<String> list) {
       list.add("");
       if (s.length() == 0) 
           list.add(s);
       else {
           list.add(s);
           String temp = s.substring(0,1);
           String next = s.substring(1, s.length());
           list.add(temp);
           sequences(next);
       }
       return list;
   }
}

我也很快写了一个测试仪,所以我可以测试问题,因为没有向我们提供测试器:

  public class tester {
    public static void main(String[] args) {
        System.out.println(Sequences.sequences("at"));
    }
}

我得到的输出是[,a]当我应该得到[,a,at,t]

欢迎任何帮助!

2 个答案:

答案 0 :(得分:2)

你在递归中 。如果你能弄清楚如何处理它,你就会被设定。

答案 1 :(得分:2)

你的算法错了。问题的一个解决方案是:

在递归的每个步骤中,将第一个字符放在一边并计算其余部分的所有子序列。然后将所有计算的子序列添加两次:一次没有第一​​个字符,另一次添加字符。

public class Sequences {

    public static ArrayList<String> sequences(String s) {
        ArrayList<String> list = new ArrayList<String>();
        if (s.length() == 0) {
            list.add("");
            return list;
        }
        String firstChar = s.substring(0, 1);
        String theRest = s.substring(1, s.length());
        ArrayList<String> siffixSequence = sequences(theRest);
        list.addAll(siffixSequence);
        for (String string : siffixSequence) {
            list.add(firstChar + string);
        }
        return list;
    }

    public static void main(String[] args) {
        System.out.println(Sequences.sequences("brat"));
        // prints [, t, a, at, r, rt, ra, rat, b, bt, ba, bat, br, brt, bra, brat]
    }

}