先用上面的一張圖說明邏輯,這就是遞歸的邏輯。
xy排序就相當於在x的空位插上y,x只有兩個空位,y插前面得帶yx,y插後面得到xy
xyz排序就相當於在xy排序的所有結果插上z,結果如圖
代碼實現如下
public static void main(String[] args){ List<String> list = sort("xy","k"); for(String s:list){ System.out.println(s); } } public static List<String> sort(String main,String insert){ List<String> result = new ArrayList<>(); if(main.length() == 1){ result.add(main+insert); result.add(insert+main); }else{ List<String> lastResult = sort(main.substring(0,main.length()-1),main.substring(main.length()-1)); for(String s:lastResult){ int insertIndex = 0; while(insertIndex<=s.length()){ if(insertIndex == 0){ result.add(insert+s); }else if(insertIndex == s.length()){ result.add(s+insert); }else{ result.add(s.substring(0, insertIndex)+insert+s.substring(insertIndex, s.length())); } insertIndex++; } } } return result; };
測試結果是:zxy;xzy;xyz;zyx;yzx;yxz;
另外測試abcd排序結果是:dcab;cdab;cadb;cabd;dacb;adcb;acdb;acbd;dabc;adbc;abdc;abcd;dcba;cdba;cbda;cbad;dbca;bdca;bcda;bcad;dbac;bdac;badc;bacd;