De toutes les solutions données ici et dans d'autres forums, c'est Mark Byers qui m'a le plus plu. Sa description m'a fait réfléchir et coder moi-même. Dommage que je ne puisse pas voter pour sa solution car je suis un débutant.
Quoi qu'il en soit, voici mon application de sa description
public class PermTest {
public static void main(String[] args) throws Exception {
String str = "abcdef";
StringBuffer strBuf = new StringBuffer(str);
doPerm(strBuf,0);
}
private static void doPerm(StringBuffer str, int index){
if(index == str.length())
System.out.println(str);
else { //recursively solve this by placing all other chars at current first pos
doPerm(str, index+1);
for (int i = index+1; i < str.length(); i++) {//start swapping all other chars with current first char
swap(str,index, i);
doPerm(str, index+1);
swap(str,i, index);//restore back my string buffer
}
}
}
private static void swap(StringBuffer str, int pos1, int pos2){
char t1 = str.charAt(pos1);
str.setCharAt(pos1, str.charAt(pos2));
str.setCharAt(pos2, t1);
}
}
Je préfère cette solution à la première dans ce fil car cette solution utilise StringBuffer. Je ne dirais pas que ma solution ne crée pas de chaîne temporaire (elle le fait en fait dans le cas de system.out.println
où le toString()
de StringBuffer est appelé). Mais je pense que c'est mieux que la première solution qui crée trop de chaînes littérales. Peut-être qu'un spécialiste des performances pourra évaluer cette solution en termes de "mémoire" (en termes de "temps", elle est déjà en retard en raison de ce "swap" supplémentaire).
3 votes
Il y a beaucoup de réponses ici : stackoverflow.com/questions/361/
0 votes
Il s'agit d'une question très populaire. vous pouvez y jeter un coup d'œil ici : careercup.com/question?id=3861299
9 votes
Il est nécessaire de mentionner une hypothèse. Les caractères sont uniques. Par exemple, pour une chaîne "aaaa", il n'y a qu'une seule réponse. Pour avoir une réponse plus générale, vous pouvez sauvegarder les chaînes de caractères dans un ensemble pour éviter les doublons
1 votes
La répétition des caractères est-elle autorisée ou non ? Une même chaîne peut-elle comporter plusieurs occurrences du même caractère ?
2 votes
Lisez la théorie (ou si, comme moi, vous êtes paresseux, allez à fr.wikipedia.org/wiki/Permutation ) et mettre en œuvre un algorithme réel. En gros, vous pouvez générer une séquence d'ordres d'éléments (le fait qu'il s'agisse d'une chaîne de caractères n'est pas pertinent) et parcourir les ordres jusqu'à ce que vous reveniez au point de départ. Restez à l'écart de tout ce qui implique une récursion ou des manipulations de chaînes de caractères.
0 votes
Belle explication et solution : nayuki.io/page/next-lexicographical-permutation-algorithm
0 votes
@CurtainDog pourquoi la recommandation d'éviter la récursion, surtout si l'on considère que ce problème est typiquement résolu de manière récursive ?
0 votes
Il est assez trivial de construire une chaîne qui casse la réponse la plus votée, sans parler de la quantité obscène d'allocations qu'elle fait. Il y a une solution itérative simple et efficace, utilisez-la :)
0 votes
Voir ceci . Vous pouvez convertir la chaîne en tableau de caractères et utiliser l'itérateur pour itérer toutes les permutations.