【问题标题】:Strings that begin with a given prefix [closed]以给定前缀开头的字符串 [关闭]
【发布时间】:2012-12-26 13:33:43
【问题描述】:

我有以下代码:

public List<String> function(String pre) {
    List<String> temp = new ArrayList<>();
    for(String str : list) {
        if(str.startsWith(pre)
            temp.add(str);
        if(str.charAt(0) > pre.charAt(0))
            break;
    }
    return temp;
}

该函数应返回以给定前缀开头的所有单词。
代码中的list是一个排序的ArrayList。此代码具有O(n) 复杂性。
我该如何改进它?
例如在log(n) 时间运行。

【问题讨论】:

  • 如果您交换数据结构,请查看前缀搜索尝试。
  • 不可能在列表中的字符串数量上比 O(n) 更好地运行,因为您可以让所有字符串(或其中大部分)以相同的前缀开头。只有多次进行多次搜索才能获得性能提升。
  • 这里曾经有一个答案指出,由于列表已排序,您可以使用 O(log n) 二进制搜索和调用 List.subList 找到匹配范围的开头和结尾() 在 O(1) 时间内提取范围,无论找到多少单词。它似乎由于某种原因被删除了——我不知道为什么,因为它对我来说似乎是正确的。
  • 这是在现已删除的答案中链接到的问题 - stackoverflow.com/questions/2218931/…

标签: java


【解决方案1】:

问题是 - 你能在O(logn)时间完成吗?
如果list 中的一半元素具有所需的前缀怎么办? 您需要将列表的那一半添加到新列表中 - 这仍然是 O(n)

【讨论】:

    【解决方案2】:

    是的,你可以

    List<String> function(List<String> list, String pre) {
        List<String> temp = new ArrayList<>();
        for(String str : list) {
            if(str.startsWith(pre))
                temp.add(str);
        }
        return temp;
    }
    

    【讨论】:

    • 和我的一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多