我的任务是查找字符串的所有子序列的问题。
例如,如果字符串是“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]
欢迎任何帮助!
答案 0 :(得分:2)
你在递归中做1}} 。如果你能弄清楚如何处理它,你就会被设定。
答案 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]
}
}