常见算法笔试题的研究3(字符串的排列种数)

题目
输入一个字符串,打印该字符串的所有排列方式。例如输入abc,打印abc、acb、bac、bca、cba、cab。

解析:该题目明显最好用递归的方式求解,先确定第一位的字符,再确定第二位的字符,依次递归下去,假如字符串长度为n,需要确定第m位的字符就依次将第m位与m之后的字符进行交换。比如:abc,可以分别将a与b、c交换,得到abc,bac,cba ,继续将abc进行递归,已经确定第一位为a,则开始确定第二位将b和c进行交换,得到acb。依次下去,最后就得到了所有的排列。

在java里面String没有交换两个字符的方法,所以得自己写一个函数

/**
 * 交换字符串s中位置第a个和第b个字符。注意是从0开始。
 */
/**
 * 交换字符串s中位置第a个和第b个字符。注意是从0开始。
 */
private static String changeString(String s,int a,int b){
      int length=s.length();
//    输入是否合法的判断
       if(a<=length&&a>=0&&b<=length&&b>=0){
//         具体的交换
           char cc[]=s.toCharArray();
           char ca=s.charAt(a);
           char cb=s.charAt(b);
           cc[a]=cb;
           cc[b]=ca; 
           return new String(cc);
       }
     return s;
 }

具体的递归代码如下,注释很详细。

public static void main(String[] args) {
    String s="abc";
     System.out.println(s);
     stringArray(s, 1);//对输入的原始字符串从第二位开始交换并打印。
     stringArray(s, 0); //从第一位开始交换递归交换并打印,但是这里没法对输入的原始字符串进行递归。
}
 /**
 * 需要对index之后的字符进行交换
 */
private static void stringArray(String s,int index){

     int length=s.length();
//   将index之后的字符依次与index位置的字符进行交换
     for(int i=index+1;i<length;i++)
     {   
//       交换index和i两个位置的字符
        String s1=changeString(s, index, i);
//      打印
        System.out.println(s1);
//      递归求解
         stringArray(s1, index+1);
     }


 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值