我试图在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();
}
如有任何帮助,我们将不胜感激,并提前向您表示感谢。
暂无答案!
目前还没有任何答案,快来回答吧!