Sie müssen einen Algo schreiben, um Anagram der gegebenen Zeichenfolge in einem bestimmten Index in lexikographisch sortierter Reihenfolge zu finden. Zum Beispiel:Algo: Suchen Sie ein Anagramm der gegebenen Zeichenfolge in einem gegebenen Index in lexikografisch sortierter Reihenfolge
Betrachten wir einen String: ABC dann alle Anagramme in sortierter Reihenfolge sind: ABC ACB BAC BCA CAB CBA. Also, für Index 5 Wert ist: CAB. Auch sei der Fall Duplikate wie für AADFS Anagramm wäre DFASA bei Index 32
Um dies zu tun, die ich geschrieben habe Algo aber ich denke, es sollte etwas weniger komplex als das sein.
import java.util.*;
public class Anagram {
static class Word {
Character c;
int count;
Word(Character c, int count) {
this.c = c;
this.count = count;
}
}
public static void main(String[] args) {
System.out.println(findAnagram("aadfs", 32));
}
private static String findAnagram(String word, int index) {
// starting with 0 that's y.
index--;
char[] array = word.toCharArray();
List<Character> chars = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
chars.add(array[i]);
}
// Sort List
Collections.sort(chars);
// To maintain duplicates
List<Word> words = new ArrayList<>();
Character temp = chars.get(0);
int count = 1;
int total = chars.size();
for (int i = 1; i < chars.size(); i++) {
if (temp == chars.get(i)) {
count++;
} else {
words.add(new Word(temp, count));
count = 1;
temp = chars.get(i);
}
}
words.add(new Word(temp, count));
String anagram = "";
while (index > 0) {
Word selectedWord = null;
// find best index
int value = 0;
for (int i = 0; i < words.size(); i++) {
int com = combination(words, i, total);
if (index < value + com) {
index -= value;
if (words.get(i).count == 1) {
selectedWord = words.remove(i);
} else {
words.get(i).count--;
selectedWord = words.get(i);
}
break;
}
value += com;
}
anagram += selectedWord.c;
total--;
}
// put remaining in series
for (int i = 0; i < words.size(); i++) {
for (int j = 0; j < words.get(i).count; j++) {
anagram += words.get(i).c;
}
}
return anagram;
}
private static int combination(List<Word> words, int index, int total) {
int value = permutation(total - 1);
for (int i = 0; i < words.size(); i++) {
if (i == index) {
int v = words.get(i).count - 1;
if (v > 0) {
value /= permutation(v);
}
} else {
value /= permutation(words.get(i).count);
}
}
return value;
}
private static int permutation(int i) {
if (i == 1) {
return 1;
}
return i * permutation(i - 1);
}
}
Kann mir jemand mit weniger komplexen Logik helfen.
Gute Frage. Ohne viel darüber nachzudenken, sieht Ihr Code für mich nicht allzu kompliziert aus. –
Ich war auf die gleiche Frage gestoßen. Hier ist der Link der [redaktionellen] (https://www.hackerearth.com/practice/math/combinatorics/basics-of-combinatorics/practice-problems/algorithm/word-rank-1/editorial/). Hoffe das hilft. –
Verwenden Sie die Suchfunktion mit "Permutation" und "Rang". – m69