编写带有下列声明的例程:
public void permute(String str);
private void permute(char[] str,int low,int high);
第一个例程是个驱动程序,他调用第二个例程并显示String str中的字符的所有排列。如果str是“abc”,那么输出的则是abc,acb,bca,bac,cab和cba。第二个例程使用递归。
public void permute(String str);
private void permute(char[] str,int low,int high);
第一个例程是个驱动程序,他调用第二个例程并显示String str中的字符的所有排列。如果str是“abc”,那么输出的则是abc,acb,bca,bac,cab和cba。第二个例程使用递归。
解决方案 »
- 求助啊~~~~~~关于变量和属性
- 记录过多问题。
- Spring与JPA结合时,如何解决懒加载下的no session or session was closed
- 我在面板上画了个圆,但当对话框弹出并遮盖后,这个圆随对话框一起消失.为什么?怎样避免?
- 关于文件打包成zip包的问题!!
- 关于 double型和int型相加的问题
- 高手请来指教:一个用JAVA如何实现复数四则运算的问题??
- java
- emacs的中文显示和输入问题
- 怎么改变EditorPane的Cursor形状?
- 100分送!JButtont 图像可以居中吗?java JButtont 图像是怎样设置的 ?
- 遇到一个很奇怪的问题,判断空字符
char[] cs=str.toCharArray();
permute(cs,0,cs.length-1);
}
private void permute(char[] str,int low,int high){
if(low==high) System.out.println(str);
for(int i=low;i<=high;i++){
if(i>low){//交换
str[low]^=str[i];
str[i]^=str[low];
str[low]^=str[i];
}
permute(str,low+1,high);
if(i>low){//换回来,还原数据
str[low]^=str[i];
str[i]^=str[low];
str[low]^=str[i];
}
}
}
使用异或来完成字符的交换,省掉了中间变量temp,节省了存储空间
str[low]^=str[i];
str[i]^=str[low];
str[low]^=str[i];
就相当于
temp = str[i];
str[i] = str[low];
str[low] = temp;
代表递归处理的终结:一个数的排列只有一种;
其后的处理简单说就是把low到high之间的数轮流放在low的位置上,并要求计算余下从low+1到high之间的排列,如此递归直到low==high则递归终结,输出结果.
注意:由于使用^=来进行数据交换,那么if(i>low)的判断非常重要,否则会出错.