Из всех решений, представленных здесь и на других форумах, мне больше всего понравился Марк Байерс.Это описание на самом деле заставило меня задуматься и написать его самому.Жаль, что я не могу проголосовать за его решение, поскольку я новичок.
В любом случае, вот моя реализация его описания
public class PermTest {
public static void main(String[] args) throws Exception {
String str = "abcdef";
StringBuffer strBuf = new StringBuffer(str);
doPerm(strBuf,str.length());
}
private static void doPerm(StringBuffer str, int index){
if(index <= 0)
System.out.println(str);
else { //recursively solve this by placing all other chars at current first pos
doPerm(str, index-1);
int currPos = str.length()-index;
for (int i = currPos+1; i < str.length(); i++) {//start swapping all other chars with current first char
swap(str,currPos, i);
doPerm(str, index-1);
swap(str,i, currPos);//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);
}
}
Я предпочитаю это решение раньше, чем первое в этой теме, потому что это решение использует StringBuffer.Я бы не сказал, что мое решение не создает никакой временной строки (на самом деле это происходит в system.out.println
, где вызывается toString()
StringBuffer).Но я просто чувствую, что это лучше, чем первое решение, где создается слишком много строковых литералов.Может быть, какой-то парень из производительности может оценить это с точки зрения «памяти» (для «времени» он уже отстает из-за этого дополнительного «обмена»)