0前缀树中等 公司套题-最小唯一前缀

最小唯一前缀

描述

输入描述:
第一行输入一个整数 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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值