Java 以给定前缀开头的字符串

Java 以给定前缀开头的字符串,java,Java,我有以下代码: 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))

我有以下代码:

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 temp=new ArrayList();
for(字符串str:list){
如果(str.startsWith(pre)
临时添加(str);
如果(str.charAt(0)>pre.charAt(0))
打破
}
返回温度;
}
函数应返回以给定前缀开头的所有单词。
代码中的列表是已排序的数组列表。此代码具有
O(n)
复杂性。
如何改进它?
e、 g.在
日志(n)
时间中运行。

是的,您可以

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;
}
列表函数(列表、字符串预处理){
List temp=new ArrayList();
for(字符串str:list){
如果(str.startsWith(pre))
临时添加(str);
}
返回温度;
}

问题是-你能在
O(logn)
时间内完成吗?
如果
列表中有一半的元素具有所需的前缀,该怎么办?

您需要将列表的这一半添加到一个新列表中-这仍然是
O(n)

,这与我的列表相同。如果您交换数据结构,请查看前缀搜索的尝试。在列表中的字符串数量上,这不可能比O(n)运行得更好,因为您可以拥有所有字符串(或大部分字符串)从相同的前缀开始。只有在必须多次执行多次搜索时,才能获得性能改进。这里曾经有一个答案,因为列表是排序的,所以可以使用O(log n)二进制搜索和调用列表找到匹配范围的开始和结束。subList()提取O(1)中的范围时间,不管找到了多少单词。它似乎因为某种原因被删除了——我不知道为什么,因为我觉得它是正确的。这就是现在删除的答案中的问题-