Trovare stringhe che contengono una data sottostringa

Oct 22 2020

Utilizzando i seguenti comandi (che potrebbero essere inefficienti) posso generare tutte le parole di lunghezza $j$ sull'alfabeto $\{0,1\}$:

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

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

Supponiamo di voler trovare tutte le parole sulla lunghezza 6 che contengono come sottostringa 101, come faccio? Ho provato a usare StringCasesma questo sembra darmi solo stringhe che iniziano o finiscono con 101. C'è un modo per fare questo?

Risposte

4 kglr Oct 22 2020 at 19:10

Due metodi aggiuntivi (entrambi più veloci di 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"}

Un'alternativa più lenta:

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

stesso risultato

3 SjoerdSmit Oct 22 2020 at 17:53

Due metodi differenti:

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

La Selectvariante è leggermente più veloce per set di dati di grandi dimensioni.