排序单词以适合给定的字符串


10

给定一个字母字符串和一组单词,输出单词的顺序,以便可以通过删除不需要的字母在字符串中找到它们。在单词集中单词可能出现多次。输入字符串和所有单词将分别包含1到1000个小写字母。要放置的字母可能出现在单词内部或单词之间。

您的程序或函数可以接受字母字符串和单词作为列表,字符串或来自STDIN,并且必须以正确的顺序输出所有单词作为列表或字符串输出。如果有多个正确的解决方案,请仅输出其中之一。如果没有正确的解决方案,请输出一个空列表或一个空字符串。

例子:

dogcatfrog cat frog dog
-> dog cat frog

xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat

dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd

flea antelope
->
(no solution)

这是代码高尔夫。最低字节数获胜。

编辑:说明多余的字符可以在单词内。


输入格式可以是一个字符串,然后是剩余字符串的另一列表吗?
门把手

@Doorknob,是的,很好。输入和输出结构很灵活。增加了挑战。
Logic Knight

从测试用例看来,放下的字母总是在单词之间。是这样吗?您应该在挑战中说明这一点,或者包括一个单词中包含字母的测试用例
Luis Mendo

我不理解第三个测试用例。您的答案放在cc前面,bb但是bbcc子字符串仅出现一次,并且bb子字符串首先出现。
尼尔

@Neil,在ccbcb字符串的一部分中,我们输出thethe中的内容,cc然后bb将它们放在中间c
逻辑骑士

Answers:


5

Pyth,20 24字节

我对Pyth的第一次尝试:)

Jcw;FG.ptJI:hJj".*"G0jdG

怎么运行的:

Jcw;FG.ptJI:hJj".*"G0jdG
Jcw                         assign("J",chop(input()))
    FG.ptJ                  for G in permutations(tail(J)):
          I:hJj".*"G0        if match(head(J),join(".*",G)):
                     jdG      print(join(" ",G))

注意:在第三个示例(dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc)中,它花费了很长时间。


5

Pyth,10个字节

h@s./Myz.p

示范

该程序非常强大。它首先构造输入的每个子集,然后构造子集的每个分区,然后检查第一个(单词列表的重新排序)。通过没有输出到stdout的错误来处理任何可能性,这是元共识所允许的。可以删除2个额外字节的错误。

请注意,对于许多给定的测试用例,该程序将无法在合理的时间内完成。


您错过了第二个测试用例。
Leaky Nun

@KennyLau当我尝试这种情况时,它根本不会在合理的时间内返回。但是,它没有给出错误的答案。我认为这有效。您有没有返回答案的测试用例,而该答案是错误的?
isaacg '16

真的很不错的方法。
Leaky Nun

你打败了我
Leaky Nun

您可以将其添加到答案中吗?
Leaky Nun

1

JavaScript(ES6),119个字节

(s,a,t=``,...r)=>a[0]?a.find((w,i)=>(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)))&&q:~s.search(t.split``.join`.*`)&&(q=r)

接受字符串和单词数组,并undefined在失败时返回单词数组。如果必须在失败时返回空字符串,则增加2个字节(?q:``),,在这种情况下,此替代版本只有120个字节,并在失败时返回空字符串,如果允许失败则返回0,甚至可以保存2个字节:

(s,a,t=``,...r)=>a[0]?a.reduce((q,w,i)=>q||(b=[...a],b.splice(i,1),f(s,b,w+t,w,...r)),0):~s.search([...t].join`.*`)?r:``

(写完这篇文章后,我注意到该算法与@KennyLau的Pyth答案基本相同。)

编辑编辑:澄清问题后更新,但是现在在第三个测试用例上确实很慢;我将它设置为前一天晚上,今天早晨,我刚刚注意到它实际上找到了解决方案,大约在30到40小时后。不过,我确实是故意的,并向其提供了解决方案(它与反向解决方案一起使用效果最佳,它将立即得到验证)。


1

Java 7,256字节

import java.util.*;String c(String...a){Map s=new HashMap();int j,i=1,l=a[0].length();for(;i<a.length;i++)if((j=a[0].indexOf(a[i]))>-1)s.put(j,s.get(j)!=null?s.get(j)+" "+a[i]:a[i]);a[0]="";for(j=0;j<l;j++)a[0]+=s.get(j)!=null?s.get(j)+" ":"";return a[0];}

当然,可以通过使用其他方法来打更多的高尔夫球,但这现在是可行的。

取消测试代码:

在这里尝试。

import java.util.*;
class M{
  static String c(String... a){
    Map s = new HashMap();
    int j,
        i = 1,
        l = a[0].length();
    for(; i < a.length; i++){
      if((j = a[0].indexOf(a[i])) > -1){
        s.put(j, s.get(j) != null
                  ? s.get(j) + " " + a[i]
                  : a[i]);
      }
    }
    a[0] = "";
    for(j = 0; j < l; j++){
      a[0] += s.get(j) != null
               ? s.get(j) + " "
               : "";
    }
    return a[0];
  }

  public static void main(String[] a){
    System.out.println(c("dogcatfrog", "cat", "frog", "dog"));
    System.out.println(c("xxcatfixsxhingonxgrapexxxfishingcxat", "cat", "grape", "catfish", "fishing"));
    System.out.println(
        c("dababbabadbaccbcbaaacdacdbdd ", "aa", "bb", "cc", "dd", "ba", "ba", "ba", "ab", "ac", "da", "db", "dc"));
    System.out.println(c("flea", "antelope"));
  }
}

输出:

dog cat frog 
cat grape fishing 
da ab ba ba ba bb db ac cc aa dd 

1

Groovy(44字节)

我不敢相信没有其他人为此使用正则表达式...

{a,b->a.findAll(/${b.join('|')}/).join(" ")}

说明

/${b.join('|')}/-创建一个正则表达式来查找字符串中的任何单词。
.findAll(...)-查找并将所有出现在字符串中的事件收集到一个数组中。
.join(" ")-将数组和空格连接在一起。

基本上,如果没有任何出现,则数组为空,并隐式返回一个空字符串。如果确实找到了实例,它将返回带有实例的数组对象,然后将其展平为字符串。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.