Java代码:
public class LegalSequence {
public static void main(String[] args) {
// System.out.println(legalSequence("BAECD"));
arr("ABCDE");
}
/**
* 判断一个序列是否可由给定序列通过栈操作获得
* @param s
* @return
*/
public static boolean legalSequence(String s) {
for (int i = 0; i < s.length(); i++) {
int index = i;
int temp = i;
for (int j = i + 1; j < s.length(); j++) {
if (s.charAt(j) < s.charAt(index)) {
if (s.charAt(j) > s.charAt(temp)) return false;
temp = j;
}
}
}
return true;
}
/**
* 输出ABCDE全排列中所有符合上面方法的序列
* @param s
*/
public static void arr(String s) {
arr(s.toCharArray(), 0, s.length() - 1);
}
/**
* 对数值a中p下标到q下标进行全排列
* @param a
* @param p
* @param q
*/
private static void arr(char[] a, int p, int q) {
//当找出一个排列时,打印数组
if (p == q) {
//打印验证
String str = "";
for (int i = 0; i < a.length; i++) {
str += a[i];
}
if (legalSequence(str)) System.out.println(str);
return;
}
//后面的元素都要和第一个元素进行交换,求剩余的元素的全排练,把交换的元素再换回来
for (int i = p; i <= q; i++) {
swap(a, p, i);
arr(a, p+1, q);
swap(a, p, i);
}
}
/**
* 交换
* @param a
* @param i
* @param j
*/
public static void swap(char[] a, int i, int j) {
char temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}