发一个全排列算法,面试时可能会用到,输入一个字符串,返回所有的排列
增加了指定几个数字不能相邻的功能,但是觉得实现不是太好,大家有何高见
如果不需要过滤相邻的字符串就改成
增加了指定几个数字不能相邻的功能,但是觉得实现不是太好,大家有何高见
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);
}