`
laiseeme
  • 浏览: 122641 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
社区版块
存档分类
最新评论

发一个全排列算法

阅读更多
发一个全排列算法,面试时可能会用到,输入一个字符串,返回所有的排列
增加了指定几个数字不能相邻的功能,但是觉得实现不是太好,大家有何高见
import java.util.ArrayList;
import java.util.List;

/**
 * 全排列numbers 
 * 
 * @author laiseeme
 */
public class RangeNumber
{
	private char[] numbers;   //输入的字符数组
	private List<String> list;//返回的全排列字符串数组
	private String regex;     //过滤相邻字符串的正则式
	
	/**
	 * 增加检索相邻字符串的正则表达式
	 * @param numbers
	 * @param notNear
	 */
	
	public RangeNumber(char[] numbers,char[] notNear)
	{
		this.numbers = numbers;
		StringBuilder sb = new StringBuilder();
		sb.append("\\d*");
		for(int i=0;i<notNear.length;i++)
		{
			sb.append("[");
			sb.append(String.valueOf(notNear));
			sb.append("]");
		}
		sb.append("\\d*");
		regex = sb.toString();
		System.out.println(regex);
	}
	
	public List range()
	{
		list = new ArrayList<String>();
		int m,n; 
		m = 0;
		n = numbers.length;
		permutation(m,n);
		return list;
	}
	
	/**
	 * 后补法全排算法
	 * @param m 数组游标
	 * @param n 字符串的长度
	 */
	private void permutation(int m, int n)
	{
		int i;
		char t;
		if (m<n-1) 
		{ 
			permutation(m+1, n);
			for (i=m+1;i<n;i++) {
				t=numbers[m];
				numbers[m]=numbers[i];
				numbers[i]=t;
				permutation(m+1, n);
				t=numbers[m];
				numbers[m]=numbers[i];
				numbers[i]=t;
			}
		}
		else
		{
			String value = String.valueOf(numbers);
			if(!value.matches(regex))
			{
				list.add(value);
			}
		}
	}
}


如果不需要过滤相邻的字符串就改成
		else
		{
			list.add(value);

		}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics