JAVA递归和非递归输出字符串的全排列
2013-07-20 23:57
127 查看
要输出字符s从[start,end]间的全排列,只要将s[start,end]依次与s[start]替换并输出s从[start+1,end]的全排列即可。
//递归输出全排列 public static void fullPermutation(String s) { permutation(s.toCharArray(),0,s.length()-1); } private static void permutation(char[] charArray,int start,int end) { if(start == end) System.out.println(new String(charArray)); else { for(int i = start;i<=end;++i) { if((i!= start && charArray[start] != charArray[i]) || i==start) { swapChar(charArray,start,i); permutation(charArray,start+1,end); swapChar(charArray,start,i); } } } } private static void swapChar(char[] charArray,int index1 ,int index2) { if(index1 < charArray.length && index2 < charArray.length) { char tmp = charArray[index1]; charArray[index1] = charArray[index2]; charArray[index2] = tmp; } }
非递归算法:
(1)将字符串s按升序排序,输出字符串(2)从后往前找到第一个相邻非逆序对的第一个元素的位置i(比如12354从后往前的第一个相邻非逆序对是25,位置是2,注:起始位置0),然后,从后往前查找第一个比s[i]大的元素的位置j(例子中是4所在的位置,即4),将s[i]和s[j]交换,并将s从i+1到结束按升序排序,输出字符串(3)重复(2)直到s中的所有元素都是逆序,即(2)中的i为-1。
public static void fullPermutationWithoutRecursion(String s) { if(s.length() == 0) return; if(s.length() == 1) { System.out.println(s); return; } char[] charArray = s.toCharArray(); quickSort(charArray,0,charArray.length - 1); outputArray(charArray); while(true) { int i = charArray.length - 1; while(i > 0)//i为从后往前第一个非逆序对的第二个元素的位置。 if(charArray[i] > charArray[i-1]) break; else --i; if(i == 0) return; else --i; int j = charArray.length - 1; while(j > i)//从后往前查找第一个比s[i]大的元素的位置 { if(charArray[j] > charArray[i]) break; else --j; } swapChar(charArray,i,j); quickSort(charArray,i+1,charArray.length-1); outputArray(charArray); } } public static void quickSort(char[] charArray,int begin,int end) { if(begin < end) { int flag = begin + (int)Math.ceil(Math.random()*(end - begin)); char tmp = charArray[flag]; swapChar(charArray,flag,end); int i = begin,j = end; while(i < j) { while(i<j && charArray[i] < tmp) ++i; if(i < j) charArray[j--] = charArray[i]; while(i<j && charArray[j] > tmp) --j; if(i<j) charArray[i++] = charArray[j]; } charArray[i] = tmp; quickSort(charArray,begin,i-1); quickSort(charArray,i+1,end); } } private static void outputArray(char[] charArray) { for(char ch : charArray) System.out.print(ch); System.out.println(); }
相关文章推荐
- 递归的应用,输出字符串的所有排列(java)
- Java递归实现字符串的倒序输出
- Java递归实现字符串全排列与全组合
- Java递归实现字符串全排列
- 字符串数组元素排列与组合的Java递归实现
- 字符串全排列与全组合的递归实现-Java版
- (递归与非递归)逆序输出字符串
- 【递归】输出一个字符串的所有排列
- java输出字符串的所有排列
- java实现有条件字符串全排列输出
- java将字符串逆序递归方式输出
- 输出字符串的全部组合/全排列 Java
- 字符串的排列,递归输出
- java中用递归将字符串做各种排序输出
- java 用递归实现:输入一个整数,用字符串逆序输出,例如输入123,输出321 ,不使用全局变量
- 用递归的思想写编写一个函数reverse_string(char * string)实现字符串反向输出和反向排列
- 用户输入字符串,输出所有排列 java
- java打印输出如下形式数列递归与非递归
- 字符串全排列 Java递归实现
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)