无法从java中的特定索引对arraylist中的字符进行排序

mi7gmzs6  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(226)

我试图在java中按字典顺序找到给定字符串的所有排列。
在这里,当试图从当前排列中找到下一个排列时,我无法对子列表进行排序。下面是我找到下一个排列的方法。
在数组列表的最右边找到小于下一个元素的元素,并将其索引作为i。
一旦我们找到了i,我们需要在found i的右边找到一个元素,这样这个元素会比found i的第i个元素大,它会比[i,n-1]范围内的其他元素小,我们把这个元素叫做j。
找到第i元素和第j元素后,我们交换这两个元素。
最后对子表[i+1,n-1]进行排序。
在纸和笔上,这个算法运行良好,我能够找到正确的下一个排列。
考虑下面的例子-
字符串i/p-“d”
第一次迭代后,o/p将为“abdc”
第二次迭代后,o/p将为“acdb”-->这不是预期o/p,预期o/p为“acbd”
第一次迭代的o/p将是第二次迭代的i/p,当在第二次迭代中找到下一个置换时,i的值将是1,j的值将是3,根据algo,我们需要交换1和3索引元素。交换之后,我们得到类似于“acdb”的东西,然后我们需要将元素从i+1排序到n-1。这种子列表排序似乎没有发生。
下面是我找到下一个排列的代码-

public String findNextPermutation(String test_str, int n) {

    ArrayList<Character> chars = new ArrayList<Character>();
    for (char c : test_str.toCharArray()) {
        chars.add(c);
    }

    int i = -1;

    // step : 1
    for (int j = 0; j < n - 1; j++) {
        if (chars.get(j) > chars.get(j + 1))
            continue;
        i++;
    }

    if (i == -1)
        return null;

    // step : 2
    char first = chars.get(i);
    int k = i + 1;
    int min_idx = k;
    while (k < n) {
        if (chars.get(k) > first && chars.get(k) < chars.get(min_idx)) {
            min_idx = k;
        }
        k++;
    }

    // step : 3
    swap(chars, i, min_idx);

    // step : 4
    int start = i + 1;
    int end = n - 1;

    Collections.sort(chars.subList(start, end));

    //Sorting is not happening !!!!!!!!

    StringBuilder sb = new StringBuilder();
    for (Character ch : chars) {
        sb.append(ch);
    }

    return sb.toString();
}

如有任何帮助,我们将不胜感激,并提前向您表示感谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题