The most common substring
75 68 97 63 bytes
lambda s,n:max(l:=[s[j:j+n]for j in range(len(s))],key=l.count)
You can try it online! Increased byte count because, as @xnor kindly pointed out, Python's
str.count doesn't count overlapping substrings... But then @xnor's reformulation of what I was doing allowed to slice a third of the bytes!
l:=[s[j:j+n]for j in range(len(s))]
This creates a list of all the substrings in
s of size
n, plus the suffixes of size
1. Then we find the
max on that list, with the numerical value being used to sort given by
That means that if
b are from
a > b if
a shows up more times in
b. This means the shorter suffixes are never the result of the
max because they only show up once, and even if the correct-sized substrings only show up once, they are first in
l so they come out instead of the short suffixes. This allows me to save some bytes in the
range used, given that I don't have to prevent
i+n from being larger than
# Python, 83 64 bytes
lambda s,n:max((s[i:i+n]for i in range(len(s)-n+1)),key=s.count)
Thanks to @mypetlion I saved a LOT of bytes :D
You can try it online with my very own incredible test case!
05AB1E, 5 bytes
Try it online or verify the smaller test cases or verify the larger test case (which is a bit slow).
Œ # Push all substrings of the (implicit) input-string Iù # Only keep substrings of a length equal to the second input-integer .M # Only keep the most frequent item of the remaining substrings # (after which it is output implicitly as result)
Brachylog, 8 bytes
Try it online!
ᶠ Find all… s …substrings of <1st element of input>… ₎ …of length <2nd element of input> ọ Get the list of each substring with its number of occurrence tᵒ Order by the number of occurrence t Take the last one h Output the substring itself