【问题标题】:Finding unordered sequences of Java String Array in recursion递归查找Java字符串数组的无序序列
【发布时间】:2014-09-11 14:00:34
【问题描述】:

我必须创建一个算法,该算法使用字符串数组显示所有可用的固定长度的无序序列。该方法需要是递归的,并且可能只需要一个整数。它还需要返回一个String数组。

假设我有“ab”和“ba”。 当我使用该方法给出 int 2 时,应该找到以下固定长度的无序序列:

abab
abba
baba
baab

我已经工作了好几个小时了,我觉得我为这件简单的事情工作得太辛苦了。我有不同类型的代码,我几乎可以正常工作(abba 显示了两次,而不是另一个序列),但我忘记将它返回到数组中,从而导致问题...... 我的代码看起来像这样,但未完成且不起作用:

static String[] syllables = {"ab", "ba"};
static String[] syllableWord;

public static void main(String[] args) {
    int amountOfSillables = 2;
    syllableWord = String[(int)Math.pow(amountOfSillables, amountOfSillables)];
    String[] syllableWords = findSequences(amountOfSillables); // I may only use one parameter,
                                     // which is 2 but should work with any number

    for (int i = 0; i < syllableWords.length; i++) {
        System.out.println(syllableWords[i]);
    }
}

public static String[] findSequences(int n) {
    if (n == 0) {
        return syllableWord;
    }
    else {
        for (int i = 0; i < syllables.length; i++) {
            syllableWord += syllables[i]; // Doesn't work because syllableWord is an array.
                                          // When it's a String this would kinda work, but it 
                                          // needs to be an array.
            findSequences(n - 1);
            syllableWord = syllableWord.substring(2); // Also doesn't work when it's an array.
        }
    }
}

有人可以帮帮我吗?这快把我逼疯了……

【问题讨论】:

  • syllableWord 不能是 perm 方法的访问权限。因为syllableWord是main方法中定义的局部变量
  • 你为什么要求在你的递归调用中只有一个参数(一个整数)?
  • 您不能使用 += 将项目添加到数组中。这段代码有很多编译错误
  • 这不是您要找的吗? stackoverflow.com/questions/20906214/…
  • 而“abab”不是“ab”和“ba”的排列。您正在尝试查找固定长度的无序序列,而不是排列。

标签: java arrays string recursion permutation


【解决方案1】:

这样的? (使用 ArrayList 比 Array 更智能,因为您不需要管理数组大小,取决于您的需要)

public static List<String> perm(int n) {
    List<String> result = new ArrayList<String>();
    if (n == 1) {
        return Arrays.asList(syllables);
    }
    for (String s : syllables) {
        for (String prefix : perm(n - 1)) {
            result.add(s + prefix);
        }
    }
    return result;
}

【讨论】:

  • 这实际上是我正在寻找的,但我不能使用 ArrayList(虽然我知道它更方便,因为它没有固定大小..)
  • 我的意思是作为一个返回值。但是,我可以在方法中使用它,并在返回之前将其转换为常规数组。谢谢!我已经修改了您的代码,以便返回值是一个字符串数组。 String [] stockArr = result.toArray(new String[result.size()]);返回库存Arr;它有效。感谢大家与我一起思考!
【解决方案2】:

我没有完全使用你的模板,而且我在递归调用中使用了多个整数。

我只用了一个数组,递归调用后的后计算很少,应该是相当高效的。

public static String[] perm(String[] data) {
    int n = (int) Math.pow(data.length, data.length);
    String[] result = new String[n];
    algo(data, result, 0, n, new StringBuilder());
    return result;
}

private static void algo(String[] data, String[] result, int offset, int width, StringBuilder acc) {
    if(width == 1) {
        result[offset] = acc.toString();
        return;
    }
    width /= data.length;
    for(int i=0; i<data.length; i++) {
        acc.append(data[i]);
        algo(data, result, offset+i*width, width, acc);
        int s = acc.length();
        acc.delete(s-data[i].length(), s);
    }
}

【讨论】:

    【解决方案3】:

    假设您只想显示该值,以下应该可以工作:

    public static void main(String args[])
    {
    
        final String[] syllables = new String[] { "ab", "ba" };
        final List<String> path = new ArrayList<String>();
        recursiveDisplay(syllables, path, 0);
    
    }
    
    private static void recursiveDisplay(final String[] syllables, List<String> path, final int index)
    {
    
        if (index < syllables.length - 1)
            for (int i = 0; i < syllables.length; i++)
            {
                path.add(syllables[i]);//add current token
                recursiveDisplay(syllables, path, index + 1);//process updated path
                path.remove(path.size() - 1);//remove processed token
            }
        else
        {
            // we have reached the end of the tree
            // let's display all possible combination of this path
    
            StringBuilder buidler = new StringBuilder();
            for (final String token : path)
                buidler.append(token);
    
            for (final String token : syllables)
                System.out.println(buidler + token);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-18
      • 2016-06-07
      • 1970-01-01
      • 2016-01-27
      • 2010-10-28
      • 2017-06-13
      • 2016-10-02
      • 1970-01-01
      相关资源
      最近更新 更多