Verilen dizenin bir sonraki daha büyük permütasyonunu bulmak için verimli bir algoritma istiyorum.Belirli bir dizgenin bir sonraki daha büyük permütasyonunu bulmak için algoritma
cevap
Wikipedia, lexicographical order generation üzerinde article numaralı telefona sahiptir. Ayrıca, bir sonraki permütasyonu oluşturmak için bir algoritma açıklar.
teklif:
Aşağıdaki algoritma sözlük sırasında belirli bir permütasyon sonraki permütasyon oluşturur. Verilen permütasyonu yerinde değiştirir.
- en yüksek endeksi
i
öyle kis[i] < s[i+1]
bulun. Eğer böyle bir indeks yoksa, permütasyon son permümandır.s[j] > s[i]
gibi en yüksekj > i
dizinini bulun. gibi biri+1
böyle bir dizin olduğundan, böyle bir varlık bulunmalıdır.- ile
s[i]
değiştir.- Son öğeye kadar
i
dizininden sonra tüm öğelerin sırasını tersine çevirin.
: adım 1 zaten [[+ 1] 'den sonuna doğru azalan sırada olduğunu, tersine sıralamaya eşdeğer olduğunu ima eder. –
Ödev? Neyse, C++ işlev std :: next_permutation veya bu bakabilirsiniz: Aşağıdaki adımı kullanarak belirli bir dize S için bir sonraki büyük lexicographic dize bulabilirsiniz
http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
.
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])
verilen dize S
sonraki büyük lexicographic dizedir. Bir de C++ 'da next_permutation
işlev çağrısını kullanabilir.
Umarım bu kod yararlı olabilir.
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";
}
}
burada açıklanan çalışan bir harika bir çözüm: https://www.nayuki.io/page/next-lexicographical-permutation-algorithm.
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. daha büyük bir
- 2. Çok büyük bir matrisin özdeğer ve özvektörünü hesaplamak için daha iyi bir algoritma nasıl bulunur
- 3. Bir sonraki olayı bir dizi olayda bulmak
- 4. Bir dizideki bir sonraki büyük elemanı bulun
- 5. Çakışan aralıkları bulmak için düzenli bir algoritma nedir?
- 6. Bir sayının diğer sayıların katları olup olmadığını bulmak için Algoritma
- 7. Bir veritabanından görsel olarak benzer fotoğraflar bulmak için algoritma?
- 8. Temel bir algoritma oluşturma - daha ilginç sürüm
- 9. Bir metindeki tüm anahtar kelimeleri bulmak için verimli algoritma
- 10. Android en kısa yol/mesafe bulmak için herhangi bir algoritma?
- 11. En iyi boyut kombinasyonunu bulmak için algoritma
- 12. Opencv'in konturları bulmak için kullandığı algoritma nedir?
- 13. Sonraki tablo satırını bulmak için JQuery'yi kullanma
- 14. Bash: bir dizgenin bir parçasının çıkarılması
- 15. Bir üyeyi kullanırken ortalama x değeri veya daha büyük olan tüm öğeleri bulmak için ActiveRecord sözdizimi
- 16. Tüm öğeleri kapsayan en az sayıda etiket bulmak için Algoritma?
- 17. Daha büyük bir vektörde bir dizinin eşleştirilmesi
- 18. Bir ağaç ayrıştırma oluşturmak için algoritma
- 19. Daha küçük bir bitmapi daha büyük bir dosyaya nasıl kopyalanır?
- 20. Belirli bir WordPress kategorisindeki sonraki/Son URL'ler
- 21. Seçilen köşelerin minimum genişleme ağacını bulmak için algoritma
- 22. İlginç bir algoritma sorunu
- 23. Çalışma zamanında neden bir pencere daha büyük?
- 24. Sözde kodda bir algoritma yazma
- 25. En büyük açık alanı saptamak için etkin algoritma
- 26. Ruby'de sınıfın her bir örneğini bulmak için:
- 27. C++ belirli bir dize için metin dosyası arama ve bu dizgenin bulunduğu satır numarasını döndürme
- 28. Bir JTextField belirli bir karakter sayısına ulaştığında bir sonraki
- 29. Belirli bir tabloya Yabancı anahtarlar bulmak için SQL Script?
- 30. Belirli bir sözcüğü içeren satırları bulmak için terminal komutu?
http://stackoverflow.com/questions/352203/generating-: Ve aşağıdaki permütasyon varsa, döndürür, çözelti, aksi
false
döndürür permutations-lazily –Bir sonraki büyük permütasyon ne anlama geliyor? Leetcode'dan geldim, bu şeyin anlamını aramak istiyorum. Adım 4'ün neden sıralanmadığını merak edenler için –