【发布时间】:2021-04-30 21:51:03
【问题描述】:
给定一个不同长度的字符串列表,我们需要在给定字符串组合生成的字符串中找出字典中最先出现的字符串。
对于输入: cda,bcs,fgr,cd
输出应该是 bcscdcdefgr
有没有比生成所有字符串组合并比较它们更好的方法?请帮忙。
【问题讨论】:
标签: java string algorithm data-structures permutation
给定一个不同长度的字符串列表,我们需要在给定字符串组合生成的字符串中找出字典中最先出现的字符串。
对于输入: cda,bcs,fgr,cd
输出应该是 bcscdcdefgr
有没有比生成所有字符串组合并比较它们更好的方法?请帮忙。
【问题讨论】:
标签: java string algorithm data-structures permutation
您需要一个简单的观察,以了解为什么简单的排序不起作用。按降序对["b", "bb", "bba"] 进行排序将为您提供["bba", "bb", "b"]。但是,字典中最先出现的单词应该是 ["bb", "bba", "b"]。
您需要创建一个比较器,您可以在其中比较字符串x 和y,如下所示:
string a = x+y和string b = y+x(基本上是xy和yx)a 和b。如果a>b,这意味着x 应该放在第一位以实现正确的字典顺序。否则y 应该放在第一位。一个简单的做法是:
static void printLargest(Vector<String> arr)
{
Collections.sort(arr, new Comparator<String>()
{
@Override public int compare(String X, String Y)
{
String XY = X + Y;
String YX = Y + X;
return XY.compareTo(YX) > 0 ? -1 : 1;
}
});
}
此解决方案不使用额外空间,并且具有O(NlogN) 时间复杂度。
【讨论】:
您可以尝试这种方法。直接排序会失败,就像b 在ba 之前一样。
List<String> words = Arrays.asList(new String[] {"b","ba","c"});
Collections.sort(words,new Comparator<String>(){
@Override
public int compare(String s1, String s2) {
return (s1+s2).compareTo(s2+s1);
}
});
String output = String.join("", words);
System.out.println(output);
【讨论】:
b 出现在 ba 之前。请重新阅读问题。
{"b","ba","c"},简单的排序和连接将产生bbac。但是babc 在字典中会排在第一位吗?
看来您只需要升序字典顺序。如果是这样,那么简单的集合排序应该在这里工作:
List<String> words = Arrays.asList(new String[] { "cda", "bcs", "fgr", "cd" });
Collections.sort(words);
String output = String.join("", words);
System.out.println(output);
打印出来:
bcscdcdafgr
【讨论】:
{"b","ba","c"} 将失败。