Kiểm tra nếu một chuỗi có thể được thực hiện với chuỗi con!


23

Đưa ra một chuỗi svà một mảng / danh sách l, xác định xem scó thể được thực hiện với các phần từ hay không l.

Ví dụ: nếu chuỗi là "Hello, world!"và danh sách là [' world!', 'Hello,'], thì chương trình / hàm sẽ trả về giá trị trung thực, bởi vì bạn có thể sắp xếp danh sách để tạo thành chuỗi. Danh sách sau đây cũng sẽ trả về một giá trị trung thực : ['l', 'He', 'o, wor', 'd!']. Chỉ cần tưởng tượng 'l'điền vào nơi nó cần trong chuỗi. Vì vậy, có, bạn có thể lặp lại các yếu tố của danh sách để tạo thành chuỗi. Nếu nó không thể tạo thành chuỗi, nó sẽ trả về giá trị giả. Phương pháp chuẩn IO, sơ hở tiêu chuẩn áp dụng.

Các trường hợp thử nghiệm:

Input (In the form of s, l)
Output (1 if possible, 0 if impossible)

"Hello, world!", ["l", "He", "o, wor", "d!"]
1

"la lal al ", ["la", " l", "al "]
1

"this is a string", ["this should return falsy"]
0

"thi is a string", ["this", "i i", " a", " string"]
0

"aaaaa", ["aa"]
0

"foo bar foobar", ["foo", "bar", " ", "spam"]
1

"ababab", ["a","ba","ab"]
1

"", ["The string can be constructed with nothing!"]
1

Có vấn đề gì không nếu mảng chứa nhiều chuỗi hơn mức cần thiết để xây dựng chuỗi chính?
Shaggy

Giá trị trả về nên là gì trong những trường hợp đó?
Shaggy

@Shaggy Sự thật. Nếu có thêm, thì chuỗi có thể được xây dựng với tất cả các phần không phụ. Tôi sẽ thêm một trường hợp thử nghiệm.
Đồng chí SparklePony

3
Tôi khuyên bạn nên thêm trường hợp kiểm tra này:"ababab", ["a","ba","ab"]
toán rác

3
Tôi khuyên bạn nên thêm một trường hợp thử nghiệm có chứa các siêu ký tự regex.
Joey

Câu trả lời:


11

Brachylog , 8 byte

~c¬{∋¬∈}

Hãy thử trực tuyến!

Điều này thực sự chậm. Mất khoảng 37 giây cho "Xin chào, thế giới!" trường hợp thử nghiệm trên PC của tôi và hết thời gian trên TIO.

Điều này đưa chuỗi thông qua biến Đầu vào và danh sách thông qua biến Đầu ra

Giải trình

             String = ?, List = .

             It is possible to find…
~c           …a deconcatenation of ?…
  ¬{   }     …such that it is impossible…
    ∋¬∈      …that an element of that deconcatenation is not an element of .

"la lal al" hơn 60 giây ...
RosLuP

1
@RosLuP Với đầu vào này và ["la", " l", "al "]dưới dạng danh sách, nó đã chấm dứt trên máy tính của tôi và trả lời đúng false.sau 6800 giây và "chỉ" 113 tỷ suy luận.
Gây tử vong

Tôi cảm thấy như viết bất cứ điều gì bằng ngôn ngữ này sẽ dẫn đến một chương trình không thể chạy được trên TIO haha.
Bạch tuộc ma thuật Urn

@carusocomputing Ngôn ngữ không phải là chậm đối với hầu hết các chương trình, nó chỉ là trong một số trường hợp do sự declarativeness của chương trình, nó kết quả trong thời gian thực hiện rất rất chậm (có thể được cải thiện đáng kể với chi phí của chiều dài code)
Fatalize

@Firthize errr ... Tôi muốn nói rằng chơi golf không viết, dường như càng ít hướng dẫn, "câu hỏi" càng rộng và bạn càng cần nhiều tính toán. Có vẻ như một ngôn ngữ tuyệt vời cho các vấn đề toán học lý thuyết.
Bạch tuộc ma thuật Urn

7

Toán học, 29 byte

StringMatchQ[#,""|##&@@#2..]&

Giải trình:

             #,               (* The first argument *)
StringMatchQ[                 (* matches the string pattern *)
               ""|##&         (*   Alternatives *)
                     @@       (*     applied to *)
                       #2     (*     the second argument *)
                         ..   (*   repeated *)
                           ]&

Giải pháp gian lận biên giới, 21 byte

StringMatchQ[#,#2..]&

Vì Mathematica là ngôn ngữ lập trình biểu tượng, không có sự khác biệt * giữa các biểu thức List[a,b,...]Alternatives[a,b,...]khác với cách chúng tương tác với các biểu tượng khác và cách chúng được hiển thị ( {a,b,...}a|b|..., tương ứng). Khi được sử dụng trong đối số thứ hai của StringMatchQ, một Alternativesbiểu thức được coi là một mẫu chuỗi và do đó chúng ta có thể lưu 8byte qua giải pháp trên của tôi bằng cách lấy đối số thứ hai làm Alternativesbiểu thức.

* Về mặt kỹ thuật Listcũng vậy Locked, nó ngăn người dùng Unprotectxâm nhập và thay đổi hành vi của nó.


1
{x,y,z}được xử lý tương tự như x|y|zđối với mô hình chuỗi phù hợp. Tôi nghĩ rằng bạn có thể thay thế ""|##&@@#2..chỉ #2...
Không phải là một cái cây

5

Bình thường, 23 byte

AQW&GhGJ.(G0Vf!xJTH aG>JlN;G

Đưa đầu vào như thế nào [['string'],['list', 'of', 'parts']]. Đầu ra là một danh sách trống hoặc một danh sách có các giá trị bên trong. Trong Pyth, một danh sách chứa bất cứ thứ gì, thậm chí là một chuỗi null ( ['']), ước tính là đúng.

Hãy thử trực tuyến!

Giải trình:

                             | Implicit: Q = eval(input())
AQ                           | Assign the first value of Q to G and the second to H
  W&GhG                      | While G is not empty and G doesn't contain an empty string:
       J.(G0                 |  Pop the first value of G and store into J
            Vf!xJTH          |  For N in elements in H that match the beginning of J:
                             |   Additional space for suppressing printing 
                    aG>JlN   |   Append to G the elements of J from the length of N to the end
                          ;  | End all loops
                           G | Print G

Giải pháp này liên tục cố gắng loại bỏ mọi phần có thể từ đầu chuỗi và theo dõi những giá trị nào nó vẫn cần xem qua.

Nếu chúng ta xem xét giá trị của Gtrong trường hợp thử nghiệm [['ababab'],['a','ba','ab']]sau mỗi lần lặp của vòng lặp while, thì đây là những gì chúng ta nhận được:

['ababab']
['babab', 'abab']
['abab', 'bab']
['bab', 'bab', 'ab']
['bab', 'ab', 'b']
['ab', 'b', 'b']
['b', 'b', '']
['b', '']
['']   <---Remember, this evaluates to True

Và, trong trường hợp thử nghiệm [['aaaaa'],['aa']], đây là những gì chúng ta nhận được:

['aaaaa']
['aaa']
['a']
[]   <---And this evaluates to False

Tôi đã tạo một trường hợp thử nghiệm khác [['aaaaaa'],['a','aa','aaa']]và kết quả đầu ra là:

['', 'aaa', 'aa', 'a', 'aa', 'a', '', 'a', '', 'aa', 'a', '', 'a', '', '', 'a', '', '']

Danh sách đầu ra chứa một đống rác bên trong nó, nhưng nó vẫn là một giá trị trung thực.


5

Perl 5 , 39 byte

38 byte mã + -pcờ.

map{chop;$v.="\Q$_\E|"}<>;$_=/^($v)*$/

Hãy thử trực tuyến!

Đối với đầu vào "Hello, world!", ["l", "He", "o, wor", "d!"](thực sự được phân tách bằng các dòng mới), nó xây dựng mẫu l|He|o, wor|d!|(với các siêu ký tự được thoát, nhờ \Q..\E), và sau đó xem nếu chuỗi đầu tiên khớp với mẫu này /^($v)*$/.

Trên TryItOnline, lưu ý rằng cần phải có một dòng mới.


"Xin chào, thế giới! L Ông o, wor d!" đầu vào này có khoảng
trắng

@RosLuP Bạn có thể cho tôi một liên kết TryItOnline được không? (Tôi không hiểu chính xác ý bạn là gì. Lưu ý rằng "false" thực sự không in gì vì đây là Perl)
Dada

Vậy in sai có gì? Trong trường hợp này, xin lỗi, nhưng dường như không có giá trị đầu ra nào đối với tôi quá hữu ích ...
RosLuP

@RosLuP Đúng vậy. Trong Perl, undeflà giá trị giả được trả về bởi hầu hết các nội dung. Và khi in nó, nó thực sự không in gì cả. Và đó chính xác là những gì tôi đang làm. In "1/0" là tự nhiên đối với các ngôn ngữ giống như C, nhưng đối với Perl, "1 / undef" là cách tự nhiên.
Dada

Không có đầu ra nào có một sự mơ hồ "nó đang chạy hoặc chương trình đã kết thúc sai?"
RosLuP

4

PHP, 69 byte

<?=($s=$_GET[0])>""?ctype_digit(strtr($s,array_flip($_GET[1])))?:0:1;

Tủ thử


Rất thông minh, tôi mất một phút để hiểu bạn đang làm gì. +1 để suy nghĩ bên ngoài hộp
Martijn

Âm tính giả cho trường hợp cạnh khó chịu đó["", ["The string can be constructed with nothing!"]]
Jonathan Allan

@Jonathan ALLan thực hiện là một chuỗi rỗng một chuỗi?
Jörg Hülsermann

Vâng, vấn đề phân vùng trống là một vấn đề trong nhiều giải pháp.
Jonathan Allan

3

Python 2, 141 byte

lambda s,l:s in[''.join(i)for r in range(len(s)+1)for j in combinations_with_replacement(l,r)for i in permutations(j)]
from itertools import*

Hãy thử trực tuyến!

Vô cùng kém hiệu quả. Trường hợp thử nghiệm đầu tiên hết thời gian trên TIO.


3

JavaScript (ES6), 59 byte

Lấy mảng các chuỗi con avà chuỗi strong cú pháp currying (a)(s). Trả về false/ true.

a=>g=s=>!s||a.some(e=>s.split(e)[0]?0:g(s.slice(e.length)))

Đã bình luận

a =>                          // main function that takes 'a' as input
  g = s =>                    // g = recursive function that takes 's' as input
    !s ||                     // if 's' is empty, return true (success!)
    a.some(e =>               // else, for each element 'e' in 'a':
      s.split(e)[0] ?         //   if 's' doesn't begin with 'e':
        0                     //     do nothing
      :                       //   else:
        g(s.slice(e.length))  //     remove 'e' at the beginning of 's' and
    )                         //     do a recursive call on the remaining part

Các trường hợp thử nghiệm


3

Haskell , 35 byte

#lấy một Stringvà một danh sách Strings, và trả về a Bool.

s#l=elem s$concat<$>mapM("":)(l<$s)

Hãy thử trực tuyến!

Đừng bận tâm đến trường hợp thử nghiệm mà tôi đã bỏ đi vì nó đã làm hỏng máy tính xách tay ít ỏi của tôi, ngay cả với -O2. Tôi nghi ngờ GHC không hợp nhất danh sách phần tử trung gian 30517578125, nó có quá nhiều chia sẻ để thu gom rác nhanh chóng và vì trường hợp thử nghiệm là sai, chương trình phải tạo ra tất cả ... hãy thử nếu bạn có thể xử lý việc đó

mapM("":)(l<$s)là một danh sách tất cả các cách tạo length sdanh sách các phần tử là chuỗi rỗng hoặc chuỗi từ l.


3

Pyth, 17 15 11 14 byte

AQ|!G}Ym-dH./G

Yêu cầu cho chuỗi rỗng đã thay đổi, thêm 3 byte.

Giải trình

AQ|!G}Ym-dH./G
AQ                     Save the input into G, H.
           ./G         Get all partitions of G.
       m-dH            Check if the parts are in H.
     }Y                The empty list should be present if and only
                           if the string can be made...
  |!G                  ... or the string might be empty.

phiên bản cũ

AQ}Ym-dH./G

Ngắn hơn chạy trong tuổi thọ của vũ trụ!

Giải trình

AQ}Ym-dH./G
AQ                  Save the input into G, H.
        ./G         Get all partitions of G.
    m-dH            Check if the parts are in H.
  }Y                The empty list should be present if and only
                        if the string can be made.

AQ&G}GsMs.pMy*HlG

Điều này là chậm khủng khiếp, nhưng nó hoạt động cho các trường hợp thử nghiệm (tầm thường nhỏ) của tôi.

Giải trình

AQ&G}GsMs.pMy*HlG
AQ                  Save the input into G, H.
             *HlG   Repeat the list of substrings for each character of G.
            y       Take the power set.
         .pM        Take every permutation of each set of substrings.
      sMs           Get a list of all the joined strings.
    }G              Check if G is one of them.
  &G                Make sure G is not empty.

3

Thạch , 14 12 8 byte

;FŒṖḟ€Ạ¬

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

;FŒṖḟ€Ạ¬   - main function, left argument s, right argument l
;F         - concatenate to the string the list, flattened to deal with "" as string
  ŒṖ       - Get all partitions of s, that is, all ways to make s from substrings
     €     - For each partition...
    ḟ      -   Filter out (exclude) those elements which are not in... 
           -   (implicit right arg) the list l. This leaves the empty set (falsy) if the partition can be made of elements from the list
      Ạ    - If any element is falsy (thus constructable from l), return 0; else return 1
       ¬   - Apply logical not to this, to yield the proper 1 = constructable from list, 0 otherwise.

sửa lỗi trong trường hợp "", ["The string can be constructed with nothing"]nhờ @Jonathan ALLan


Sai âm cho"", ["The string can be constructed with nothing!"]
Jonathan Allan

Nó sẽ chậm hơn nhiều nhưng ;FŒṖḟ⁹$€Ạ¬sẽ sửa nó.
Jonathan Allan

... Và bạn có thể sử dụng một đối số đúng ngầm định cho , vì vậy bạn không cần $hoặc : ;FŒṖḟ€Ạ¬.
Jonathan Allan

Grr, đó là những gì tôi nhận được khi không kiểm tra từng testcase. Tôi có thể duy trì 8 byte bằng cách thay thế ¬bằng một hoạt động luôn trả về giá trị đúng với đối số đúng "".
fireflame241

^ tôi cũng đã nhận được nó trở lại 8 :)
Jonathan Allan


2

Bình thường, 10 8 byte

f!-TQ./+zh

Bộ kiểm tra

Cái này lấy danh sách trên dòng đầu tiên của STDIN và chuỗi (không có dấu ngoặc kép) ở dòng thứ hai.

Để bắt đầu, danh sách được lưu trữ Qvà chuỗi được lưu trữ trong z. Tiếp theo, chúng tôi hình thành tất cả các phân vùng có thể của z. Mỗi phân vùng sẽ được lọc ( f) để kiểm tra nếu nó chỉ sử dụng các phần trong Q. Để làm điều này, chúng tôi xóa tất cả các thành phần Qtừ T, phân vùng chúng tôi đang phân vùng và phủ nhận một cách hợp lý kết quả với !, để chỉ các phân vùng chứa mọi phần tử được Qgiữ.

Để khắc phục sự cố ''không có phân vùng, chúng tôi thêm từ đầu tiên của từ điển vào z, để nó không phải là một chuỗi trống.


Bộ kiểm tra bỏ lỡ dòng dưới cùng (một chuỗi trống) - Nó có cần trích dẫn không? Với một dòng trống hoặc ""dường như thất bại trong trường hợp đó.
Jonathan Allan

Một chuỗi rỗng không có phân vùng, vì vậy nó thực sự chỉ đưa ra câu trả lời sai ở đây. Chết tiệt, tôi sẽ cố gắng sửa nó.
isaacg

Cách khắc phục tôi đề xuất cho Jelly là nối chuỗi đầu vào với mảng đầu vào được làm phẳng, có lẽ bạn có thể làm tương tự?
Jonathan Allan

@Jonathan ALLan Tôi đã làm một cái gì đó tương tự, cảm ơn.
isaacg

Các trường hợp "", [""]"", []chưa được bảo hiểm - không được đến đó :)
Jonathan Allan

2

PowerShell, 61 58 57 byte

{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};+!$s}

Hãy thử trực tuyến!

Giải pháp cũ:

{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};[int]!$s}
{$s,$l=$_;$l|sort -d length|%{$s=$s.replace($_,'')};0+!$s}  

Cái này gần như không thể đọc được, vì vậy tôi khuyên bạn nên thay đổi nó một chút. Tôi khá chắc chắn hầu hết những người khác sẽ đồng ý.
Rɪᴋᴇʀ

Cảm ơn bạn đã giải thích lý do sửa chữa giải pháp của tôi.
Andrei Odegov

1

Python 2, 64 byte

lambda s,l:len(re.findall("^("+"|".join(l)+")*$",s))>0
import re

Hãy thử trực tuyến này!


Tôi nghĩ rằng điều này không hoàn toàn làm việc, hãy thử ("aaaaaaa",["aa","aaa"]).
xnor

@xnor Mình cập nhật rồi. Hãy đến để tìm hiểu, regex là hoàn hảo cho việc này.
Neil

4
('x', '.')Tôi đoán là thất bại , nhưng không.
Joey

1
@nfnneil Có phải bạn không? Chỉnh sửa cuối cùng của bạn là 10 giờ trước.
Dennis

1
... Hoặc "Hello", ["\w"]vv
Jonathan Allan

1

PowerShell, 78

$s,$l=$args;!($s-creplace(($l|sort -d length|%{[regex]::escape($_)})-join'|'))

Cách tiếp cận dựa trên regex khá đơn giản.


1

CJam (16 byte)

{Ma+1$,m*:e_\a&}

Đây là một khối ẩn danh (hàm) lấy chuỗi và mảng chuỗi trên ngăn xếp. Bản demo trực tuyến .

Nó sử dụng thuật toán rõ ràng:

{        e# Declare a block. Call the args str and arr
  Ma+    e#   Add the empty string to the array
  1$,m*  e#   Take the Cartesian product of len(str) copies of (arr + [""])
  :e_    e#   Flatten each element of the Cartesian product into a single string
  \a&    e#   Intersect with an array containing only str
}

Giá trị trả về là một mảng / chuỗi rỗng (falsy) nếu strkhông thể được tạo hoặc một mảng chứa str(trung thực, ngay cả khi strchính nó là chuỗi rỗng) nếu nó có thể được thực hiện.


@RosLuP, tôi không chắc ý của bạn là gì. Trường hợp thử nghiệm cụ thể đó thực thi nhanh đến mức tôi thực sự không thể thực hiện được. Các trường hợp thử nghiệm khác mất nhiều thời gian để thực thi, nhưng thông số kỹ thuật không bao gồm bất kỳ ràng buộc thời gian nào.
Peter Taylor

@RosLuP, bản demo trực tuyến . Nhưng tôi không hiểu khiếu nại của bạn là gì.
Peter Taylor

1

C ++ (Bcc), 287 byte

#include<algorithm.h>
f(a,b)char*a,**b;{int i,j,k,v,p[256];if(!a||!b||!*b)return-1;for(v=0;v<256&&b[v];++v)p[v]=v;if(v>=256)return-1;la:for(i=0,j=0;j<v&&a[i];){for(k=0;b[p[j]][k]==a[i]&&a[i];++i,++k);j=b[p[j]][k]?(i-=k),j+1:0;}if(a[i]&&next_permutation(p,p+v)) goto la;return i&&!a[i];}

bởi vì tôi không viết hoặc sử dụng quá nhiều next_permuting () tôi không biết liệu tất cả có ổn không. Tôi không biết 100% nếu đó là một giải pháp quá có thể đây là chất lượng ... Một danh sách các chuỗi ở đây là một mảng các con trỏ tới char; Kết thúc NULL Algo rất dễ, có một thuật toán tuyến tính thử nếu tất cả các chuỗi trong danh sách phù hợp với đối số "a" chuỗi có một thuật toán khác cho phép chỉ số của danh sách chuỗi để nó thử tất cả các kết hợp có thể.

ungolf nó, mã kiểm tra và kết quả ở đây

#include<stdio.h>
g(a,b)char*a,**b;
{int i,j,k,v,p[256];
 if(!a||!b||!*b) return -1;
 for(v=0;v<256&&b[v];++v) p[v]=v;
 if(v>=256)      return -1; // one array of len >256 is too much
la: 
 for(i=0,j=0;j<v&&a[i];)
   {for(k=0;b[p[j]][k]==a[i]&&a[i];++i,++k); 
    j=b[p[j]][k]?(i-=k),j+1:0;
   } 
 if(a[i]&&next_permutation(p,p+v)) goto la;
 return i&&!a[i];  
}

#define F for
#define P printf

test(char* a, char** b)
{int i;
 P("f(\"%s\",[",a);
 F(i=0;b[i];++i) 
       P("\"%s\"%s", b[i], b[i+1]?", ":"");
 P("])=%d\n", f(a,b));
}

main()
{char *a1="Hello, world!",    *b1[]={"l","He", "o, worl", "d!",      0};//1
 char *a2="la lal al ",       *b2[]={"la", " l", "al ",              0};//1
 char *a3="this is a string", *b3[]={"this should return falsy",     0};//0
 char *a4="thi is a string",  *b4[]={"this", "i i", " a", " string", 0};//0
 char *a5="aaaaa",            *b5[]={"aa",                           0};//0
 char *a6="foo bar foobar",   *b6[]={"foo","bar"," ","spam",         0};//1
 char *a7="ababab",           *b7[]={"a","ba","ab",                  0};//1
 char *a8="",                 *b8[]={"This return 0 even if has to return 1", 0};//0
 char *a9="ababc",            *b9[]={"a","abc", "b", 0};//1

  test(a1,b1);test(a2,b2);test(a3,b3);test(a4,b4);test(a5,b5);test(a6,b6);
  test(a7,b7);test(a8,b8);test(a9,b9);
}

f("Hello, world!",["l", "He", "o, worl", "d!"])=1
f("la lal al ",["la", " l", "al "])=1
f("this is a string",["this should return falsy"])=0
f("thi is a string",["this", "i i", " a", " string"])=0
f("aaaaa",["aa"])=0
f("foo bar foobar",["foo", "bar", " ", "spam"])=1
f("ababab",["a", "ba", "ab"])=1
f("",["This return 0 even if has to return 1"])=0
f("ababc",["a", "abc", "b"])=1

cái này sẽ biên dịch trong trình biên dịch gcc C ++

#include<algorithm>

int f(char*a,char**b){int i,j,k,v,p[256];if(!a||!b||!*b)return -1;for(v=0;v<256&&b[v];++v)p[v]=v;if(v>=256)return -1;la:;for(i=0,j=0;j<v&&a[i];){for(k=0;b[p[j]][k]==a[i]&&a[i];++i,++k);j=b[p[j]][k]?(i-=k),j+1:0;}if(a[i]&&std::next_permutation(p,p+v))goto la;return i&&!a[i];}

Phải yêu C ++! :)
MEMark

1

Python, 66 byte

lambda s,l:s==''or any(x==s[:len(x)]and f(s[len(x):],l)for x in l)

Ung dung:

def f(s,l):
    if s=='': 
        return 1
    for x in l:
        if s.startswith(x) and f(s[len(x):],l):
            return 1
    return 0

0

Máy chủ Microsoft Sql, 353 byte

u as(select s.n,s collate Latin1_General_BIN s,l collate Latin1_General_BIN l,
row_number()over(partition by l.n order by len(l)desc)r from s,l where s.n=l.n),
v as(select n,s,l,replace(s,l,'')c,r from u where r=1 union all
select u.n,u.s,u.l,replace(v.c,u.l,''),u.r from v,u where v.n=u.n and v.r+1=u.r)
select s,iif(min(c)='',1,0)u from v group by n,s

Kiểm tra nó trực tuyến.

Phiên bản dễ đọc:

with s as(
  select n,s
  from(values(1,'Hello, world!'),
             (2,'la lal al '),
             (3,'this is a string'),
             (4,'thi is a string'),
             (5,'aaaaa'),
             (6,'foo bar foobar'),
             (7,'ababab'),
             (8,''))s(n,s)),
l as(
  select n,l
  from(values(1,'l'),(1,'He'),(1,'o, wor'),(1,'d!'),
             (2,'la'),(2,' l'),(2,'al '),
             (3,'this should return falsy'),
             (4,'this'),(4,'i i'),(4,' a'),(4,' string'),
             (5,'aa'),
             (6,'foo'),(6,'bar'),(6,' '),(6,'spam'),
             (7,'a'),(7,'ba'),(7,'ab'),
             (8,'The string can be constructed with nothing!'))l(n,l)),
--The solution starts from the next line.
u as(
  select s.n,
    s collate Latin1_General_BIN s,
    l collate Latin1_General_BIN l,
    row_number()over(partition by l.n order by len(l)desc)r
  from s,l
  where s.n=l.n),
v as(
  select n,s,l,replace(s,l,'')c,r from u where r=1
    union all
  select u.n,u.s,u.l,replace(v.c,u.l,''),u.r
  from v,u
  where v.n=u.n and v.r+1=u.r
)
select s,iif(min(c)='',1,0)u from v group by n,s

0

C, 140 byte

Tôi chắc chắn có một cách ngắn hơn để làm điều này trong C nhưng tôi muốn tạo ra một giải pháp kiểm tra tất cả các kết hợp có thể có của các chuỗi thay vì phương pháp tìm / thay thế thông thường.

char p[999];c,o;d(e,g,l,f)int*e,**g,**l;{c=f&&c;for(l=g;*l;)strcpy(p+f,*l++),(o=strlen(p))<strlen(e)?d(e,g,0,o):(c|=!strcmp(e,p));return c;}

Dùng thử trực tuyến

Ung dung:

#include <string.h>
#include <stdio.h>

char buf[999];
int result;
int temp;

int test(char *text, char **ss, char **ptr, int length) 
{
    if (length == 0)
        result = 0;

    for(ptr = ss; *ptr; ptr++)
    {
        strcpy(buf + length, *ptr);
        temp = strlen(buf);
        if (temp < strlen(text))
        {
            // test recursivly
            test(text, ss, 0, temp);
        }
        else
        {
            if (strcmp(buf, text) == 0)
                result = 1;
        }
    }
    return result;
}

int main()
{
    char *text = "Hello,World";
    char *keywords[] = { "World", "Hello", ",", 0 };
    printf("%d", test(text, keywords, 0, 0));
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.