给一个字符串数组,判断其能否组成首尾相连的数组

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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值