【问题标题】:Find out string that would come in first in dictionary among strings generated by combination of given strings在给定字符串组合生成的字符串中找出字典中第一个出现的字符串
【发布时间】:2021-04-30 21:51:03
【问题描述】:

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

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

输出应该是 bcscdcdefgr

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

【问题讨论】:

    标签: java string algorithm data-structures permutation


    【解决方案1】:

    您需要一个简单的观察,以了解为什么简单的排序不起作用。按降序对["b", "bb", "bba"] 进行排序将为您提供["bba", "bb", "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) 时间复杂度。

    【讨论】:

      【解决方案2】:

      您可以尝试这种方法。直接排序会失败,就像bba 之前一样。

      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);
      

      【讨论】:

      • OP 似乎希望 b 出现在 ba 之前。请重新阅读问题。
      • @TimBiegeleisen 对于{"b","ba","c"},简单的排序和连接将产生bbac。但是babc 在字典中会排在第一位吗?
      【解决方案3】:

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

      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"} 将失败。
      猜你喜欢
      • 2019-11-04
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2013-10-04
      • 2010-12-25
      相关资源
      最近更新 更多