描述
输入描述:
第一行输入一个整数 n 表示字符串个数
后面n行,每行一个字符串,一共n串互不相同的字符串。(2 <= n <= 100,字符串长度不超过100)
输出描述:
输出n行,每行一个字符串,依次是每个字符串的最小可唯一识别前缀
分析
两种思路,一种是暴力遍历,把每个字符串和除过自己以外的字符串比较,得到最长公共前缀,时间复杂度是O(n)。另一种是用前缀树,把所有的字符串存入前缀树当中,然后再遍历每个字符串,若当前节点的出现次数是1说明已经找到最小唯一前缀了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
String[] strings = new String[N];
for (int i = 0; i < N; i++)
strings[i] = scanner.next();
scanner.close();
Trie root = new Trie();
for(String str : strings){
Trie cur = root;
for(int i = 0; i < str.length(); i++){
char ch = str.charAt(i);
if(cur.next[ch-'0'] == null){
cur.next[ch-'0'] = new Trie();
}else{
cur.next[ch-'0'].times++;
}
cur = cur.next[ch-'0'];
}
}
for(String str : strings){
Trie cur = root;
int i = 0;
for(; i < str.length(); i++){
char ch = str.charAt(i);
if(cur.next[ch-'0'].times == 1){
System.out.println(str.substring(0,i+1));
break;
}
cur = cur.next[ch-'0'];
}
if(i == str.length()){
System.out.println(str);
}
}
}
}
class Trie{
int times;
Trie[] next;
Trie(){
times = 1;
next = new Trie[100];
}
}