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.