我想要一個有效的算法來查找給定字符串的下一個更大排列。查找給定字符串的下一個更大排列的算法
41
A
回答
115
維基百科有關辭典生成的不錯article。它還描述了生成下一個排列的算法。
引用:
以下算法給定的置換之後字典順序生成下一個排列。它改變了原來的給定排列。
- 查找指數最高
i
這樣s[i] < s[i+1]
。如果不存在這樣的索引,則排列是最後的排列。- 查找最高索引
j > i
,例如s[j] > s[i]
。這樣的j
必須存在,因爲i+1
就是這樣一個索引。- 交換
s[i]
與s[j]
。- 顛倒索引
i
之後的所有元素的順序直到最後一個元素。
+10
對於那些想知道爲什麼第4步不排序的人,第1步已經意味着從第[i + 1]到結束它已經是降序,因此反向相當於排序 – 2016-01-04 08:48:23
4
家庭作業?無論如何,可以看看C++函數的std :: next_permutation,或這樣的:
http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
1
我們可以找到使用以下步驟給定的字符串S中的一個最大的字典字符串。
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. i.e., sort(S[i+1]..S[len(S) - 1])
給定的字符串是S
的下一個最大的字典字符串。也可以使用C++中的next_permutation
函數調用。
-6
我希望這段代碼可能會有幫助。
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";
}
}
9
有用的一個很好的解決方案在這裏描述:https://www.nayuki.io/page/next-lexicographical-permutation-algorithm。而解決方案是,如果接下來的排列存在,返回它,否則返回false
:
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;
}
0
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.
相關問題
- 1. 查找給定的字符串值列表中的字符串
- 2. 如何查找給定字符串的排列順序?
- 3. 在給定字符串排列的排序列表中查找給定排列的索引
- 4. 在一個大字符串的字符串/令牌後,查找下一個子
- 5. 查找字符串的下一個最高字母序列排列
- 6. 找到一個給定的字符串
- 7. 給定一個字符串,計算沒有重複(和禁止字符)的字符串排列的數目
- 8. 給定一個字符串,找到它的所有排列是在字典
- 9. 用條件查找給定N的所有排列的算法
- 10. 給定字符串的Python排列
- 11. 什麼是下面算法的複雜性順序查找給定字符串的子字符串
- 12. 如何查找字符串的排列?
- 13. 一個給定的字符串中查找字符串模式的重複
- 14. 查找包含給定的字符串
- 15. 排列字符串列表算法
- 16. 查找大字符串的子序列
- 17. 算法找到一個字符串
- 18. Linux查找給定多個字符或字符串的文件
- 19. 查找特定字符串的一列中,並找到對應於串最大
- 20. pandas:查找給定列包含特定子字符串的行
- 21. 查找給定的字符串是使用scala的另一個字符串的子字符串的多少次
- 22. 在給定的字符串中查找第一個不同的字符
- 23. 給定一個字符串,找到一個字符串開始的行開始
- 24. 找到給定字符串後的第一個字符
- 25. 如何查找給定字符串中的特定字符?
- 26. 查找字符串中的下一個字符?
- 27. 從給定字符串生成下一個字符串
- 28. 使用jQuery查找給定字符串的p-tag中的前一個和下一個10個字
- 29. 查找下一個多行的算法
- 30. C#算法,重新排列字符串中的字符
http://stackoverflow.com/questions/352203/generating- permutations-lazily – 2009-10-26 00:25:55
「下一個更大的排列」是什麼意思?我來自Leetcode,想要搜索這個東西的意義。 – 2016-11-16 02:20:00