Menemukan string yang berisi substring tertentu
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
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
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.