【发布时间】:2020-02-17 01:02:49
【问题描述】:
我正在解决在线问题,任务是这样的:
有两个数组:数字和前缀。
- 数组
numbers包含数字:“+432112345”、“+9990”、“+4450505”- 数组
prefixes包含前缀:“+4321”、“+43211”、“+7700”、“+4452”、“+4”查找每个号码的最长前缀。如果没有找到数字前缀,则匹配空字符串。
例如:
- “+432112345”匹配最长前缀“+43211”(不是+4321,因为43211更长)。
- “+9990”不匹配任何内容,所以空字符串“”。
- “+4450505”与“+4”匹配(“+4452”不匹配,因为 2)。
我想出了最直接的解决方案,我用每个前缀遍历每个数字。所以每次新号码,我都会检查前缀,如果某个前缀比上一个长,我会改变。
Map<String, String> numsAndPrefixes = new HashMap<>();
for (String number : A) {
for (String prefix : B) {
if (number.contains(prefix)) {
// if map already contains this number, check for prefixes.
// if longer exists, switch longer one
if (numsAndPrefixes.containsKey(number)) {
int prefixLength = prefix.length();
int currentLen = numsAndPrefixes.get(number).length();
if (prefixLength > currentLen) {
numsAndPrefixes.put(number, prefix);
}
} else {
numsAndPrefixes.put(number, prefix);
}
} else if (!number.contains(prefix) && !numsAndPrefixes.containsKey(number)){
numsAndPrefixes.put(number, "");
}
}
}
所以它将有两个 for 循环。我看到每次我一遍又一遍地做同样的工作,例如检查前缀。它有效,但速度很慢。问题是我想不出更好的东西。
有人能解释一下他们将如何找到更好的算法吗?
更一般地说,如果您有一些可行的解决方案并试图找到更好的解决方案,您将如何进行?我还缺少什么知识?
【问题讨论】:
-
您可以使用 Trie 或 Suffix 树数据结构来获得更优化的解决方案,但它仍然取决于时间限制等类似的东西,如果您的解决方案运行得足够快,可以满足您的目的,那么这些数据结构就太过分了。跨度>
-
您确实意识到
number.contains(prefix)是O(max_prefix.length)并且您检查了numbers.length*prefix.length次,您的实际复杂性最终以O(n*p*max_prefix.length)结束,其中n是numbers 的数量而p是prefixes 的编号。 -
不,我没有意识到这一点。感谢您指出这一点。将检查
contains()功能。 -
其实
contains就是O(max_number.length)
标签: java algorithm data-structures