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());
            }
        }
    }
  • 相关阅读:
    Hive-0.12.0 配置Mysql的Metasotre
    cdecl、stdcall、fastcall、thiscall函数调用约定区别 (转)
    汇编函数 哪些寄存器在使用时需要保护和恢复现场
    如何用C++ 写Python模块扩展(二)
    如何用C++ 写Python模块扩展(一)
    python装饰器装饰原理探秘
    Linux 命令
    iOS为所需要的视图添加模糊效果--UIVisualEffectView
    UIAlertView ----警告视图
    Virtual Box 下Ubuntu桥接网络设置
  • 原文地址:https://www.cnblogs.com/zadomn0920/p/6361455.html
Copyright © 2011-2022 走看看