我需要代码(或以下问题的代码片段或提示如何解决):
通过从s中删除一个或多个字符来获得字符串s的子序列。字符串s = abc
的子序列集合为a, ab, ac, abc, b, bc, c,
,空字符串(所有字符串的子序列)。
查找s的所有可能子序列,并按字典顺序打印它们。
这就是我所说的,但它不起作用:
TreeSet<String> ls = new TreeSet<>();
for(int i=0;i<s.length();i++)
{
for(int j=i;j<s.length();j++)
{
StringBuffer sb = new StringBuffer();
for(int k=i;k<j+1;k++)
{
sb.append(s.charAt(k));
}
ls.add(sb.toString());
}
}
return ls.toArray(new String[ls.size()]);
结果:
TestCase : abc
输出: 一个 AB ABC b 公元前 ç
预期产出: 一个 AB ABC AC b 公元前 ç
答案 0 :(得分:0)
您的代码会查找子字符串,它们是原始字符串中连续的字符序列。但是,"ac"
取自输入字符串的非 - 连续字符,并且您不会使用您的方法获得该输出。
有一点需要注意的是,你的输入字符串有3个字符,有8个可能的输出(包括空字符串),2 3 = 8.这应该表明你想要所有4个布尔值的8种可能组合,其中每个布尔值可以是true
或false
。然后,每个布尔值对应于输入字符串的一个字符,其中true
表示输入字符串中的字符在输出中,false
表示它不是。然后,通过查看所有可能的true / false组合,生成8个输出字符串。使用TreeSet
对其进行排序的代码似乎运行正常。
有几种可能的方法:
(1)使用boolean
数组并找到所有可能的组合。您可以从所有false开始,然后将第一个从false更改为true,但随后将其更改回来,每当您将布尔值从true更改为false时,您必须更改 next 数组中的布尔值也是。您可以尝试在纸上进行此操作,看看它是如何工作的。
(2)认识到你的boolean
数组相当于一个整数的位,你可以通过重复地向整数加1来获得所有可能的位组合。然后,您可以使用位操作来确定要包含的输入字符串的哪些字符。
(3)递归。如果输入字符串为"abc"
,则递归查找"bc"
的所有子序列。对于S
的每个子序列"bc"
,S
将是"abc"
的一个子序列,"a" + S
将是另一个子序列。