微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

找出在由给定字符串组合生成的字符串中首先出现在字典中的字符串

如何解决找出在由给定字符串组合生成的字符串中首先出现在字典中的字符串

给定一个不同长度的字符串列表,我们需要在给定字符串组合生成的字符串中找出字典中最先出现的字符串。

对于输入: cda、bcs、fgr、cd

输出应该是 bcscdcdefgr

有没有比生成字符串的所有组合并进行比较更好的方法?请帮忙。

解决方法

您似乎只想要字典升序。如果是这样,那么简单的集合排序应该在这里工作:

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 一样失败。

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","bb","bba"] 将为您提供 ["bba","b"]。但是,字典中第一个出现的词应该是 ["bb","bba","b"]
您需要创建一个比较器,您可以在其中比较字符串 xy,如下所示:

  1. 创建 string a = x+ystring b = y+x(基本上是 xyyx
  2. 比较 ab。如果 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。