zoukankan      html  css  js  c++  java
  • 按要求罗列所有字符串字符序列

    描述

    针对1、2、2、3、4、5这6个数字,编写一个函数,打印出所有不同的排列,要求4不能排第三位,3和5不能相连。

    分析

    可以利用图的深度遍历。

    3和5不能相连 - 意味图中3和5不直连。 

    4不能排第三位 - 这个可以在遍历后做判断。

    注意:由于题中6个数有重复,故遍历时是有重复的序列的,故使用了set过滤了重复的元素。

    代码

    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    public class Test {
        private int[] numbers = {1, 2, 2, 3, 4, 5};
        private int n = numbers.length;
        private boolean[] visited = new boolean[n];
        private int[][] graph = new int[n][n];
        private String combination = "";
    
        public Set<String> getAllCombinations() {
            buildGraph();
    
            Set<String> set=new HashSet<String>();
            for(int i=0;i<n;i++){
                this.depthFirstSearch(i,set);  //每个节点都出发一遍
            }
            return set;
        }
        /*
        * 从start节点开始深度遍历
        * */
        private void depthFirstSearch(int start,Set<String> set){
            visited[start]=true;
            combination=combination+numbers[start];
            if(combination.length()==n){
                if(combination.indexOf("4")!=2)
                    set.add(combination);
            }else{
                for(int j=0;j<n;j++){
                    if(graph[start][j]==1&&visited[j]==false)
                        depthFirstSearch(j,set);
                }
            }
            combination=combination.substring(0,combination.length()-1);  //[0,length()-1)
            visited[start]=false;
        }
    
        /*
        *  建图
        * */
        public void buildGraph() {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (i == j)
                        graph[i][j] = 0;
                    else
                        graph[i][j] = 1;
                }
            }
            //确保3到5无连线
            graph[3][5] = 0;
            graph[5][3] = 0;
        }
    
        public static void main(String[] args) {
            Test test=new Test();
            Set<String> set=test.getAllCombinations();
            Iterator<String> iter=set.iterator();
            while(iter.hasNext()){
                System.out.println(iter.next());
            }
        }
    }
  • 相关阅读:
    windows下 删除指定文件夹里面一周前的所有文件和文件夹的bat
    freeswitch 把SIP注册信息数据库从SQLITE 改为MYSQL的方法
    memcached+Mysql(主从)
    Linux下的MySQL主主复制
    RabbitMQ php 使用
    如果你写PHP, 请多注意自己是否有良好的习惯
    MySQL主从配置的一些总结
    Mongodb与mysql语法比较
    Yii框架tips
    Windows下Python添加MySQLdb扩展模块
  • 原文地址:https://www.cnblogs.com/zadomn0920/p/6361455.html
Copyright © 2011-2022 走看看