按要求罗列所有字符串字符序列
描述
针对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()); } } }