자바 Catenyms 구현 (집합 + dfs + 오로라 리 턴)
A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For example, the following are catenyms: dog.gopher
gopher.rat
rat.tiger
aloha.aloha
arachnid.dog
A compound catenym is a sequence of three or more words separated by periods such that each adjacent pair of words forms a catenym. For example,
aloha.aloha.arachnid.dog.gopher.rat.tiger
Given a dictionary of lower case words, you are to find a compound catenym that contains each of the words exactly once. Input
The first line of standard input contains t, the number of test cases. Each test case begins with 3 <= n <= 1000 - the number of words in the dictionary. n distinct dictionary words follow; each word is a string of between 1 and 20 lowercase letters on a line by itself. Output
For each test case, output a line giving the lexicographically least compound catenym that contains each dictionary word exactly once. Output “***” if there is no solution. Sample Input
2 6 aloha arachnid dog gopher rat tiger 3 oak maple elm Sample Output
aloha.arachnid.dog.gopher.rat.tiger
중국어 설명
유의 어 는 마침표 로 구 분 된 한 쌍 의 단어 로 첫 번 째 단어의 마지막 자 모 는 두 번 째 단어의 마지막 자모 와 같다.예 를 들 어 다음은 분류 이름 입 니 다.
개.두더지
두더지
쥐, 호랑이
아 로 하, 아 로 하
거미 강 동물
복합 어 의 는 세 개 또는 세 개 이상 의 단어 로 구 성 된 서열 로 이 단어 들 은 문장 으로 분리 되 어 서로 인접 한 단어 마다 하나의 의 미 를 형성한다.예컨대
아 로 하.아 로 하.거미 강 동물.개.두더지.호랑이.
소문 자 단 어 를 지정 한 사전 입 니 다. 단 어 를 한 번 만 포함 하 는 복합 catenym 을 찾 을 수 있 습 니 다.
입력
표준 입력 의 첫 줄 은 t, 즉 테스트 용례 의 수량 을 포함한다.각 테스트 용례 는 3 < = n < = 1000 - 사전 의 단어 수로 시작한다.뒤에 n 개의 서로 다른 사전 단어 가 있 습 니 다.모든 단어 자체 가 한 줄 에 1 에서 20 개의 소문 자 사이 의 문자열 이다.
출력
모든 테스트 용례 에 대해 한 줄 을 출력 하고 사전 식 최소 복합 클래스 별명 을 제시 합 니 다. 이 클래스 의 별명 은 모든 사전 단 어 를 한 번 씩 포함 하고 있 습 니 다.해결 방안 이 없 으 면 '* *' 를 출력 합 니 다.
package com.liuzhen.practice;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static int MAX = 30; // 26
@SuppressWarnings("unchecked")
public static ArrayList[] map = new ArrayList[MAX];
public static String[] path;
public static int count; // DFS ,
public static int start;
public static int[] inDegree = new int[MAX];
public static int[] outDegree = new int[MAX];
public static ArrayList result = new ArrayList();
class MyComparator implements Comparator {
public int compare(edge arg0, edge arg1) {
String A = arg0.word;
String B = arg1.word;
int judge = A.compareTo(B);
if(judge > 0)
return 1;
else if(judge < 0)
return -1;
return 0;
}
}
static class edge {
public int a; //
public int b; //
public String word; //
public boolean used; //
public edge(int a, int b, String word) {
this.a = a;
this.b = b;
this.word = word;
used = false;
}
}
public void init(int k) {
start = MAX;
for(int i = 0;i < MAX;i++) {
map[i] = new ArrayList();
inDegree[i] = 0;
outDegree[i] = 0;
}
path = new String[k];
for(int i = 0;i < k;i++)
path[i] = "";
count = 0;
}
public boolean judgeDegree() {
int in = 0, out = 0;
for(int i = 1;i < map.length;i++) { // map[i]
if(map[i].size() > 1)
Collections.sort(map[i], new MyComparator());
}
for(int i = 0;i < inDegree.length;i++) {
if(inDegree[i] == outDegree[i])
continue;
else if(inDegree[i] - outDegree[i] == 1)
in++;
else if(outDegree[i] - inDegree[i] == 1) {
out++;
start = i; // , ,
} else
return false;
}
if(in == out && (in == 0 || in == 1))
return true;
return false;
}
public void dfs(int begin) {
for(int i = 0;i < map[begin].size();i++) {
edge temp = map[begin].get(i);
if(temp.used == false) {
temp.used = true;
path[count++] = temp.word;
dfs(temp.b);
}
}
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int t = in.nextInt();
while(t > 0) {
t--;
int k = in.nextInt();
test.init(k);
for(int i = 0;i < k;i++) {
String A = in.next();
int a = A.charAt(0) - 'a';
int b = A.charAt(A.length() - 1) - 'a';
start = Math.min(start, Math.min(a, b));
map[a].add(new edge(a, b, A));
outDegree[a]++;
inDegree[b]++;
}
StringBuilder temp = new StringBuilder("");
if(test.judgeDegree()) { //
test.dfs(start);
if(count == k) { //
for(int i = 0;i < k;i++) {
temp.append(path[i]);
if(i != k - 1)
temp.append(".");
}
} else {
temp.append("***");
}
} else {
temp.append("***");
}
result.add(temp.toString());
}
for(int i = 0;i < result.size();i++)
System.out.println(result.get(i));
}
}
실행 결과:
6
aloha
arachnid
dog
gopher
rat
tiger
oak
maple
elm
aloha.arachnid.dog.gopher.rat.tiger
***
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바를 잡아버려 (1)나의 생각을 적고 복습을 해버릴 것 이다 책을 펼치자 마자 나오는 설명인데 그 안의 내용을 실행하게 된다 라고 설명을 해준다 아래 소스코드와 실행 결과로 위에 설명을 보충해준다 사칙연산과 나머지를 계산하는 것 비교연...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.