剑指offer面试题28-字符串的排列

题目:

/**
* 输入一个字符串,打印出该字符串中字符的所有排列。<br/>
* 例如输入字符串abc,则打印出由字符串abc所能排列出来的所有字符串abc,acb,bca,cab和cba。
* */


这里用递归比较好:

第一个是a,那么剩下的就问bc的排列有多少种

第一个是b,剩下的问ac

第一个是c,剩下的问ab

那么方法就有了:

当前这个数分别与他后面的数交换位置,然后求后面的有多少中排列。

代码:

package com.aii.algorithm;

public class Permutation {

	/**
	 * 输入一个字符串,打印出该字符串中字符的所有排列。<br/>
	 * 例如输入字符串abc,则打印出由字符串abc所能排列出来的所有字符串abc,acb,bca,cab和cba。
	 * */
	public void permutate(char[] str) {
		if (str == null) {
			return;
		}
		// 先判断空,然后再由permutate方法操作
		// 第二个参数是当前的字符的角标
		permutate(str, 0);
	}

	private void permutate(char[] str, int index) {
		// 此次递归结束标记,即到了str的最大长度,index==str.length
		if (index == str.length) {
			for (int i = 0; i < str.length; i++) {
				System.out.print(str[i]);
			}
			System.out.println();
			return;
		}

		// 从i=index到i=str.length-1为止
		// index和i交换位置,然后查找子串,递归
		for (int i = index; i < str.length; i++) {
			char tmp = str[index];
			str[index] = str[i];
			str[i] = tmp;
			permutate(str, index + 1);
		}
	}
}


你可能感兴趣的:(字符串,排列)