从给定的字符串中形成所有可能的单词

时间:2017-07-18 18:04:50

标签: java text combinatorics

我正在开发电子商务应用程序,我需要从给定的字符串中生成所有可能的单词。

示例
输入字符串: {ab}
预期产出: a,ab,ba,b

截至目前,我的输出结果为: a,ab,b
我在从结束回溯时遇到问题以生成字符串 ba

package com.ecommerce.util;

import java.util.HashSet;

public class Combinations {
    private StringBuilder output = new StringBuilder();
    private final String inputstring;

    public Combinations(final String str) {
        inputstring = str;
        System.out.println("The input string  is  : " + inputstring);
    }
    public HashSet<String> combine() {
        HashSet<String >set=new HashSet<>();
        combine(0,set);
        System.out.println(set);
        return set;
    }

    private void combine(int start,HashSet<String >set) {
        for (int i = start; i < inputstring.length(); ++i) {
            output.append(inputstring.charAt(i));
            System.out.println(output);
            set.add(output.toString());
            if (i < inputstring.length())
                combine`enter code here`(i + 1,set);
            output.setLength(output.length() - 1);
        }
    }
}

先谢谢你帮助我。

1 个答案:

答案 0 :(得分:1)

您搜索的内容与集合中的功率集非常相似。在{a, b}的示例中,这是集合{{}, {a}, {b}, {a, b}}。有一些简单的计算算法,可以在SO Obtaining a powerset of a set in Java找到一个。

您还可以在维基百科上找到说明和伪代码:Power set at Wikipedia

请注意,根据定义,功率集还包含空集{},您可以从链接算法获得的结果中减去它(或者在创建时直接拒绝它)。

如果你想获得abba你也可以只需对powerSet方法的输出使用置换方法,该方法创建每个元素的字符的所有排列。这也已在SO处回答,例如:Generating all permutations of a given string

如果不进行修改,您可以使用链接的方法powerSet(Set<T> originalSet),使用该代码段返回Set<Set<T>>permutation(String str)

String input = ... // Your input here

// Convert the input into a set of character
final Set<Character> inputSet = new HashSet<>();
for (int i = 0; i < input.length(); i++) {
    inputSet.add(input.charAt(i));
}

// Use the method to compute the power set
Set<Set<Character>> powerSet = powerSet(inputSet);

// Output all elements
for (Set<Character> element : powerSet) {
    // Combine the character in the set to a String
    StringBuilder sb = new StringBuilder();
    for (Character c : element) {
        sb.append(c);
    }

    // Here is a final element ready for collection or a print
    String outputElement = sb.toString();
    // The method already prints the results by itself, you can modify it easily such that it returns a Set<String> or similar
    permutation(outputElement);
}