大致题意:给定一系列单词,为每个单词寻找最短前缀使其能被唯一标识,与其他单词都区分开来
网上百度出的几道Trie树的题目发现用容器,比如HashMap等就可以做,但是这道似乎就不行了,相当来说
应该是Trie树的典型应用题。思路比较简单,就是Trie树建立,结点统计被几个单词占用了,然后再对每个单词
遍历一遍Trie树找到第一个结点只被该单词占用的(即该结点上记录的cnt值为1)。如果遍历完了都没有,说明
该单词最短前缀只能是该单词自身了。其实理解了Trie树这道题还是好做的。
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
/**
* @param args
*/
static BufferedReader reader;
static String str;
static char ch[][];
static int cnt, num;
static int arr[][];
static int word[], nums[], pre[], ans[];
private static void deal() {
int number, totalnum;
totalnum = 0;
word = new int[21 * cnt + 1];
nums = new int[21 * cnt + 1];
ans = new int[cnt + 1];
for (int i = 1; i <= cnt; i++) {
number = 0;
for (int j = 0; j < ch[i].length; j++)
if (arr[number][ch[i][j] - 'a'] == 0) {
totalnum++;
arr[number][ch[i][j] - 'a'] = totalnum;
nums[totalnum]++;
number = totalnum;
} else {
number = arr[number][ch[i][j] - 'a'];
nums[number]++;
}
word[number] = i;
}
for (int i = 1; i <= cnt; i++) {
number = 0;
totalnum = 0;
for (int j = 0; j < ch[i].length; j++) {
number = arr[number][ch[i][j] - 'a'];
totalnum++;
if (nums[number] == 1)
break;
}
ans[i] = totalnum;
}
for (int i = 1; i <= cnt; i++) {
for (int j = 0; j < ch[i].length; j++)
System.out.print(ch[i][j]);
System.out.print(" ");
for (int j = 0; j < ans[i]; j++)
System.out.print(ch[i][j]);
System.out.println();
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
reader = new BufferedReader(new InputStreamReader(System.in));
str = reader.readLine();
ch = new char[1001][];
cnt = 0;
while (str != null) {
cnt++;
ch[cnt] = str.toCharArray();
str = reader.readLine();
}
arr = new int[21 * cnt + 1][27];
deal();
}
}