按要求罗列所有字符串字符序列

描述

针对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());
        }
    }
}

 

posted @ 2017-02-02 18:38  hellozay  阅读(249)  评论(0编辑  收藏  举报