繁体   English   中英

如何计算一组字符串的最短唯一前缀?

[英]How to compute shortest unique prefixes of a set of strings?

这是命令行解析中非常常见的算法。 给定一组预定义的长选项名称 - 计算唯一标识其中一个选项的最短前缀。 例如,对于以下选项:

-help
-hostname
-portnumber
-name
-polymorphic

这将是输出:

-he
-ho
-por
-n
-pol

我正在考虑两种可能的方法 - 作为一棵树:

               *
             / | \
            /  |  \
           H   N   P
          / \      |
         E   O     O
                  / \
                 R   L

或者通过搜索子串:

for (String s : strings) {
   for (int i = 1; i < s.length(); s++) {
      if (search(strings,s.substring(0,i)) == 1) {
          result.add(s.substring(0,i);
          break;
      }
   }
}

所以,问题是:

  1. 你会选哪个?
  2. 我错过了明显的第三种方式吗?

“树”解决方案是Patricia trie的一个特例(嗯,实际上它非常普遍)。

第一个通常会更快查找。 内存考虑可能与您的上下文无关,因为它不是永久使用的,而您只执行一次“查找”。

我做树了,看起来很好。

您可以构建每个可能的不同子字符串的哈希值。

Hashmap<String, String> validSubs = new Hashmap<String, String>();
HashSet<String> usedSubs = new HashSet<String>();

for (String option : options) {
  for(int i = 0; i <= option.length; i++) {
    String sub = option.substring(0, i);
    if(usedSubs.contains(sub)) {
      validSubs.remove(sub);
    } else {
      validSubs.add(sub, option);
      usedSubs.add(sub);
    }
  }
}

哦,是的,最明显的缺失答案是使用已经完成此操作的库。 如何在Java中解析命令行参数?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM