您的位置:首页 > 编程语言 > Java开发

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();
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: