返回一个字符串数组,其中包含按字典顺序排序的s(空字符串除外)的所有子序列?

时间:2016-08-29 00:39:19

标签: java string permutation combinatorics subsequence

我需要代码(或以下问题的代码片段或提示如何解决):

通过从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 公元前 ç

1 个答案:

答案 0 :(得分:0)

您的代码会查找子字符串,它们是原始字符串中连续的字符序列。但是,"ac"取自输入字符串的 - 连续字符,并且您不会使用您的方法获得该输出。

有一点需要注意的是,你的输入字符串有3个字符,有8个可能的输出(包括空字符串),2 3 = 8.这应该表明你想要所有4个布尔值的8种可能组合,其中每个布尔值可以是truefalse。然后,每个布尔值对应于输入字符串的一个字符,其中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将是另一个子序列。