Tôi muốn một thuật toán hiệu quả để tìm hoán vị lớn hơn tiếp theo của chuỗi đã cho.Thuật toán để tìm hoán vị lớn hơn tiếp theo của một chuỗi đã cho
Trả lời
Wikipedia có kiểu dáng đẹp article khi tạo thứ tự từ điển. Nó cũng mô tả một thuật toán để tạo ra hoán vị tiếp theo.
Trích dẫn:
Thuật toán sau tạo ra hoán vị tiếp theo theo từ điển sau một hoán vị nhất định. Nó thay đổi hoán vị đã cho tại chỗ.
- Tìm chỉ số cao nhất
i
màs[i] < s[i+1]
. Nếu không có chỉ mục như vậy tồn tại, hoán vị là hoán vị cuối cùng.- Tìm chỉ mục cao nhất
j > i
sao chos[j] > s[i]
. Vì vậy,j
phải tồn tại, vìi+1
là một chỉ mục như vậy.- Hoán đổi
s[i]
vớis[j]
.- Đảo ngược thứ tự của tất cả các phần tử sau chỉ mục
i
cho đến phần tử cuối cùng.
cho những người đang tự hỏi tại sao bước 4 không phải là sắp xếp: bước 1 đã ngụ ý rằng từ s [i + 1] đến cuối nó đã theo thứ tự giảm dần, do đó đảo ngược tương đương với sắp xếp –
Bài tập về nhà? Dù sao, có thể nhìn vào hàm C++ std :: next_permutation, hay này:
http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
Chúng ta có thể tìm ra chuỗi tự từ điển lớn nhất tiếp theo cho một chuỗi S được sử dụng các bước sau đây.
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])
Chuỗi đã cho là chuỗi từ điển lớn nhất tiếp theo là S
. Người ta cũng có thể sử dụng gọi hàm next_permutation
trong C++.
Tôi hy vọng mã này có thể hữu ích.
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";
}
}
Giải pháp tuyệt vời hoạt động được mô tả ở đây: https://www.nayuki.io/page/next-lexicographical-permutation-algorithm. Và giải pháp đó, nếu hoán vị kế tiếp tồn tại, trả về nó, nếu không thì trả 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;
}
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. Tìm các chuỗi con được sắp xếp theo hoán vị
- 2. Thuật toán để tìm hoán vị số cho chỉ số từ vựng
- 3. Giải pháp lặp lại cho: - Tìm các hoán vị chuỗi
- 4. Thuật toán hoán vị mà không cần đệ quy? Java
- 5. Tìm tất cả các vị trí của chuỗi con trong một chuỗi lớn hơn trong C#
- 6. chuỗi thuật toán chuyển vị
- 7. Thuật toán chuỗi tìm kiếm
- 8. hiệu quả tính toán hoán vị tiếp theo của chiều dài k từ sự lựa chọn n
- 9. Có một thuật toán để tạo ra tất cả các hoán vị tròn duy nhất của một multiset?
- 10. Thuật toán để tìm các yếu tố của một số đã cho .. Phương pháp ngắn nhất?
- 11. cần trợ giúp thiết kế cho thuật toán tìm kiếm theo cách hiệu quả hơn
- 12. Thuật toán tìm kiếm chuỗi
- 13. Tìm tất cả các hoán vị duy nhất của một chuỗi mà không tạo các bản sao
- 14. Chuỗi Tìm/Thay thế Thuật toán
- 15. Thuật toán tìm số thứ tự của các khoảng trống dài nhất trong một chuỗi đã cho
- 16. Xin giải thích thuật toán này để có được tất cả các hoán vị của một String
- 17. hoán vị của một vector
- 18. Thuật toán nhanh nhất để tìm một chuỗi trong một chuỗi các chuỗi?
- 19. Thuật toán đếm số lần xuất hiện của ma trận bên trong một lớn hơn
- 20. số để ánh xạ hoán vị duy nhất của một chuỗi có chứa các bản sao
- 21. Thuật toán để áp dụng hoán vị trong không gian bộ nhớ liên tục
- 22. Thuật toán để tìm tất cả các vị trí Kinh độ của Vĩ độ trong một khoảng cách nhất định từ vị trí Lat Lng đã cho
- 23. Tìm một bộ hoán vị, với một ràng buộc
- 24. nhanh hơn thuật toán độ tương phản cho một bitmap
- 25. Sử dụng Java để tìm chuỗi con của một chuỗi lớn hơn sử dụng Regular Expression
- 26. Thuật toán nào nhanh hơn để kiểm tra xem một bit đã được đặt chưa?
- 27. Thuật toán xem đã giải mã cho CAD
- 28. Máy phát hoán vị nhanh hơn
- 29. Lưu lượng trong thuật toán chuyển tiếp cho HMM
- 30. Các hoán vị có thể có của đầu vào BST
http://stackoverflow.com/questions/352203/generating- hoán vị-lazily –
'hoán vị lớn hơn tiếp theo 'nghĩa là gì? Tôi đến từ Leetcode, muốn tìm kiếm ý nghĩa của điều này. –