public class Main {
public static String x=null;
public static void main(String args[]) {
// String [] str = {"gwj","jcl","dlg","akd","qag"};
String [] str = {"gj","jl","dg","ad","gg"};
fun(str, 0);
if(x!=null){
System.out.println(x);
}else{
System.out.println("No");
}
}
public static void fun(String[] str, int k) {
if (k == str.length) {
x=Arrays.toString(str);
return;
}
for (int i = k; i < str.length; ++i) {
// 交换k+1和i
// k=0,表明为第一个字符串,必须和自己以及后面每一个交换
// k>0时,假设0-(k-1)是排序好的,我们需比较k-1和i的顺序
if (k > 0 && judge(str[k - 1], str[i])) {
swap(str, k, i);
fun(str, k + 1);
swap(str, k, i);
} else if (k == 0) {
swap(str, k, i);
fun(str, k + 1);
swap(str, k, i);
}
}
}
private static void swap(String[] a, int s, int i) {
String t = a[s];
a[s] = a[i];
a[i] = t;
}
public static boolean judge(String s1, String s2){
if(s1.charAt(s1.length()-1)==s2.charAt(0)){
return true;
}
return false;
}
}
如果只判断,能否生成,不用给出生成的数组的话,可以只提取每个字符串的首位字母,然后求全排列,判断是否满足条件。
public class Main {
public static void main(String[] args) {
String[] s=new String[]{"abc","dda","bcd","cab"};
// String[] s = {"gwj","jcl","dlg","akd","qag"};
System.out.println(isLink(s));
}
private static int isLink(String[] s) {
StringBuffer sb=new StringBuffer();
for(String str:s){
sb.append(str.charAt(0));
sb.append(str.charAt(str.length()-1));
}
List<String> list=listAll(Arrays.asList(sb.toString().split("")),"");
for(String str:list){
if(check(str)){
return 1;
}
}
return 0;
}
private static boolean check(String str) {
for(int i=1;i<=str.length()-3;i=i+2){
if(str.charAt(i)!=str.charAt(i+1)){
return false;
}
}
return true;
}
private static List<String> listAll(List<String> candidate, String prefix) {
List<String> list=new ArrayList<String>();
if(candidate.isEmpty()) {
list.add(prefix);
}else {
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);//为了方便提取后删除每个元素
List<String> results=listAll(temp, prefix + temp.remove(i));
for(String s:results){
list.add(s);
}
}
}
return list;
}
}
求所有位置的排列,判断是否符合条件
public class Main3 {
public static void main(String[] args) {
String [] s = {"gwj","jcl","dlg","akd","qag"};
// String[] s=new String[]{"abc","dda","bcd","cab"};
String result=canLink(s);
if(result!=null){
System.out.println(result);
}else{
System.out.println("Can't Link");
}
}
private static String canLink(String[] s) {
List<Integer> locations=new ArrayList();
for(int i=0;i<s.length;i++){
locations.add(i);//有几个位置
}
List<List<Integer>> numslist=listAll(locations,new ArrayList());//位置的所有组合数
for(List<Integer> list:numslist){
int i;
for(i=0;i<list.size()-1;i++){
if(!check(s[list.get(i)],s[list.get(i+1)])){
break;
}
}
if(i==list.size()-1){
String[] result=new String[s.length];
int k=0;
for(Integer j:list){
result[k++]=s[j];
}
return Arrays.toString(result);
}
}
return null;
}
private static boolean check(String string, String string2) {
if(string.charAt(string.length()-1)!=string2.charAt(0)){
return false;
}
return true;
}
private static List<List<Integer>> listAll(List<Integer> candidate, ArrayList<Integer> prefix) {
List<List<Integer>> list=new ArrayList<>();
if(candidate.isEmpty()){
list.add((ArrayList<Integer>) prefix.clone());
}else{
for(int i=0;i<candidate.size();i++){
List tempcandidate=new LinkedList(candidate);
ArrayList tempprefix=new ArrayList(prefix);
tempprefix.add((Integer) tempcandidate.remove(i));
List<List<Integer>> results=listAll(tempcandidate,tempprefix);
for(List<Integer> thislist:results){
list.add(thislist);
}
}
}
return list;
}
}