algorithm来查找给定string的下一个更大的排列
我想要一个有效的algorithm来查找给定string的下一个更大的排列。
维基百科在辞典生成方面有一篇不错的文章 。 它还描述了生成下一个排列的algorithm。
引用:
以下algorithm在给定排列后按照字典顺序生成下一个排列。 它在原地改变给定的排列。
- find
s[i] < s[i+1]
的最高指数。 如果不存在这样的指数,排列是最后的排列。- find最高指标
j > i
这样s[j] > s[i]
。 这个j
必须存在,因为i+1
就是这样一个索引。- 用
s[j]
交换s[i]
s[j]
。- 颠倒索引
i
之后的所有元素的顺序直到最后一个元素。
一个伟大的解决scheme的作品在这里描述: https : //www.nayuki.io/page/next-lexicographical-permutation-algorithm 。 如果下一个排列存在,则返回它,否则返回false
的解决scheme:
function nextPermutation(array) { var i = array.length - 1; while (i > 0 && array[i - 1] >= array[i]) { i--; } if (i <= 0) { return false; } var j = array.length - 1; while (array[j] <= array[i - 1]) { j--; } var temp = array[i - 1]; array[i - 1] = array[j]; array[j] = temp; j = array.length - 1; while (i < j) { temp = array[i]; array[i] = array[j]; array[j] = temp; i++; j--; } return array; }
家庭作业? 无论如何,可以看看C ++函数std :: next_permutation,或者这个:
http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
我们可以使用以下步骤find给定stringS的下一个最大的字典string。
1. Iterate over every character, we will get the last value i (starting from the first character) that satisfies the given condition S[i] < S[i + 1] 2. Now, we will get the last value j such that S[i] < S[j] 3. We now interchange S[i] and S[j]. And for every character from i+1 till the end, we sort the characters. ie, sort(S[i+1]..S[len(S) - 1])
给定的string是S
的下一个最大的字典string。 也可以在C ++中使用next_permutation
函数调用。
nextperm(a,n)
1. find an index j such that a[j….n - 1] forms a monotonically decreasing sequence. 2. If j == 0 next perm not possible 3. Else 1. Reverse the array a[j…n - 1] 2. Binary search for index of a[j - 1] in a[j….n - 1] 3. Let i be the returned index 4. Increment i until a[j - 1] < a[i] 5. Swap a[j - 1] and a[i] O(n) for each permutation.
我希望这个代码可能会有所帮助。
int main() { char str[100]; cin>>str; int len=strlen(len); int f=next_permutation(str,str+len); if(f>0) { print the string } else { cout<<"no answer"; } }