package com.interview.algorithms.general; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created_By: stefanie * Date: 14-7-26 * Time: 下午1:04 */ public class C1_39_StringConjunction { public static String conjoin(int m, String[] strs){ //Build a graph based on can conjoin or not int[][] graph = new int[strs.length][strs.length]; for(int i = 0; i < strs.length; i++) for(int j = 0; j < strs.length; j++) if(strs[i].substring(1).equals(strs[j].substring(0, m))) graph[i][j] = 1; //find the longest path and build the result string List<Integer> path = longestPath(graph); StringBuilder builder = new StringBuilder(); builder.append(strs[path.get(0)]); for(int i = 1; i < path.size(); i++){ builder.append(strs[path.get(i)].charAt(m)); } String result = builder.toString(); //check if the result string can conjoin itself if(result.substring(0, m).equals(result.substring(result.length() - m))) return null; else return result; } public static List<Integer> longestPath(int[][] graph){ List<Integer> longestPath = new ArrayList<Integer>(); Set<Integer> visited = new HashSet<Integer>(); for(int i = 0; i < graph.length; i++){ if(!visited.contains(i)){ int[] v = new int[graph.length]; v[i] = 1; List<Integer> path = findPath(graph, i, v); if(path.size() > longestPath.size()) longestPath = path; visited.addAll(path); } } return longestPath; } public static List<Integer> findPath(int[][] graph, int node, int[] visited){ List<Integer> maxPath = new ArrayList<Integer>(); for(int i = 0; i < graph.length; i++){ if(graph[node][i] == 1 && visited[i] != 1) { visited[i] = 1; List<Integer> path = findPath(graph, i, visited); if(path.size() > maxPath.size()) maxPath = path; visited[i] = 0; } } maxPath.add(0, node); return maxPath; } }