zoukankan      html  css  js  c++  java
  • 字符串数组排序,如果可以保证前一个字符的末尾与后一个字符的开头相同,返回1,否则返回-1

      今天在中兴的笔试模拟题里看到了这样的一个算法题:

      一个字符串数组String[] arr,将其按照如下的方式排列:前一个字符串的末尾字符与后一个字符串的起始字符相同,比如["ab", "bc", "cd"],则返回1;如果无法形成这样的排列,则返回-1.

      本菜鸡一开始我也没想出思路,递归,动规,想了一圈也没写出来。只能使出百度大发,在https://segmentfault.com/q/1010000005152540看到了思路:使用dfs算法。

      1.首先根据字符串数组简历邻接表存储,每个链表存储起始字符与当前字符的末尾字符相同的字符串数组元素的下标。

      2.字符串数组的元素依次作为dfs算法的起始点,每次执行dfs算法,访问到一个未被访问过的节点,则计数加1,如果计数值等于字符串数组的长度,则表示找到了这么衣蛾排列方式,返回1。

       如果所有的字符串数组的元素都遍历过,任然没有找到这么一种排列,则返回-1.

      代码如下,如有错误请指出:

    import java.util.LinkedList;
    import java.util.List;
    
    public class Solution {
    
        /**
         * @param args
         */
        static boolean[] visited = null;
        static int count = 0;
        static int totalNum = 0;
        static boolean flag = false;
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String[] arr = { "ab", "de", "bf", "cd" };
            System.out.println(isLinked(arr));
        }
    
        public static int isLinked(String[] arr) {
    
            if (arr == null || arr.length == 0) {
                return -1;
            }
            totalNum = arr.length;
            List<LinkedList<Integer>> list = new LinkedList<LinkedList<Integer>>();
            for (int i = 0; i < arr.length; i++) {
                List<Integer> tmpList = new LinkedList<Integer>();
                for (int j = 0; j < arr.length; j++) {
                    if (i != j
                            && arr[i].charAt(arr[i].length() - 1) == arr[j]
                                    .charAt(0)) {
                        tmpList.add(j);
                    }
                }
                list.add((LinkedList<Integer>) tmpList);
            }
    
            
            for(int i = 0; i < arr.length; i++){
                count = 0;
                visited = new boolean[arr.length];
                dfs(list, i);
                if(flag){
                    return 1;
                }
            }
            return -1;
    
        }
    
        private static void dfs(List<LinkedList<Integer>> list, int index) {
    
            count++;
            visited[index] = true;
            if(count == totalNum){
                flag = true;
            }
            boolean flag = false;
            for(int i : list.get(index)){
                if(!visited[i]){
                    dfs(list, i);
                }
            }
    
        }
  • 相关阅读:
    排列组合之全排列
    Shell脚本学习指南 [ 第一、二章 ] 背景知识、入门
    Scala基础知识[一]
    Hadoop JVM调整解决 MapReduce 作业超时问题
    PL_SQL学习
    Oracle实用操作
    Fernflower 反编译.class文件
    Java命名规范
    Oracle学习笔记1
    JDBC连接MySQL与Oracle
  • 原文地址:https://www.cnblogs.com/qj4d/p/7418144.html
Copyright © 2011-2022 走看看