Menemukan string yang berisi substring tertentu

Oct 22 2020

Menggunakan perintah berikut (yang mungkin tidak efisien) saya dapat menghasilkan semua kata yang panjangnya $j$ pada alfabet $\{0,1\}$:

sd[st_]:=StringDelete[st, " "]

name[j_]:=Map[sd,Map[StringRiffle,Tuples[{0, 1}, j] ]]

Misalkan saya ingin mencari semua kata pada panjang 6 yang berisi sebagai substring 101, bagaimana cara melakukannya? Saya telah mencoba menggunakan StringCasestetapi ini sepertinya hanya memberi saya string yang dimulai atau diakhiri dengan 101. Apakah ada cara untuk melakukan ini?

Jawaban

4 kglr Oct 22 2020 at 19:10

Dua metode tambahan (keduanya lebih cepat dari Select[strings, StringContainsQ["101"]]):

strings = Map[StringJoin, Tuples[{"0", "1"}, 6]];

Pick[strings, StringContainsQ["101"] @ strings]
{"000101", "001010", "001011", "001101", "010100", "010101", 
"010110", "010111", "011010", "011011", "011101", "100101", "101000", 
"101001", "101010", "101011", "101100", "101101", "101110", "101111", 
"110100", "110101", "110110", "110111", "111010", "111011", "111101"}

Alternatif yang lebih lambat:

Pick[strings, StringMatchQ["*101*"]@strings]

hasil yang sama

3 SjoerdSmit Oct 22 2020 at 17:53

Dua metode berbeda:

strings = Map[StringJoin, Tuples[{"0", "1"}, 6]];
Flatten @ StringCases[
  strings,
  StartOfString ~~ ___ ~~ "101" ~~ ___ ~~ EndOfString
]
Select[strings, StringContainsQ["101"]]

The Selectvarian sedikit lebih cepat untuk dataset besar.