Logo

Programming-Idioms

Find how many times string s contains substring t.
Specify if overlapping occurrences are counted.
Implementation
Python

Implementation edit is for fixing errors and enhancing with metadata. Please do not replace the code below with a different implementation.

Instead of changing the code of the snippet, consider creating another Python implementation.

Be concise.

Be useful.

All contributions dictatorially edited by webmasters to match personal tastes.

Please do not paste any copyright violating material.

Please try to avoid dependencies to third-party libraries and frameworks.

Other implementations
import "strings"
x := strings.Count(s, t)
let c = s.matches(t).count();
s.scan(t).size
import std.algorithm;
auto occurrences = s.count(t);
sum [ 1 | r <- tails s, isPrefixOf t r ]
my $t="banana bo bana bandana";

my $c =()= $t=~ m/ana/g;
print "count without overlap: $c\n";

$c =()= $t =~ m/an(?=a)/g;
print "count with overlap: $c\n";
uses strutils;
function Count(t, s: String): Integer;
var
  Offset, P: Integer;
begin
  Result := 0;
  Offset := 1;
  P := PosEx(t, s, Offset);
  while P > 0 do
  begin
    Inc(Result);
    P := PosEx(t, s, P + 1);
  end;
end;
$c = substr_count($s , $t);
import org.apache.commons.lang3.StringUtils;
int count = StringUtils.countMatches(s, t);
let n = 0 // the number of occurences
let acc = s
let i
while ((i = acc.indexOf (t)) + 1) {
  n++
  acc = acc.slice (i + 1)
}
  lt = len(t) - 1
  k = 1
  num = 0
  do
     print *,s(k:)
     i = index(s(k:),t)
     if (i==0) exit
     num = num + 1
     k = k + i + lt
  end do
  print *,num
int SubstringCount(string s, string t, bool allowOverlap = false)
{
  int p = 0;
  int tl = allowOverlap ? 1 : t.Length;
  int cnt = 0;

  while (1 == 1)
  {
    p = s.IndexOf(t, p);
    if (p == -1) break;
    p += tl;
    cnt++;
  }
  return cnt;
}
#include <string.h>
unsigned n;
for (n = 0; s = strstr(s, t); ++n, ++s)
	;
Data.List
length . filter (isPrefixOf t) . tails $ s
(count (re-seq t s))
s |> String.split(t) |> Enum.drop(1) |> length()
countOccurence(List1, List2) ->
        countOccurence(List1, List2, 0).

countOccurence(_, [], Count) ->
        Count;
countOccurence(List1, [_ | Rest] = List2, Count) ->
        case (lists:prefix(List1, List2)) of
                true ->
                        countOccurence(List1, Rest, Count + 1);
                false ->
                        countOccurence(List1, Rest, Count)
        end.

countOccurence("ab", "abcddababa").
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern pattern = Pattern.compile(Pattern.quote(t));
Matcher matcher = pattern.matcher(s);
int count = 0;
while(matcher.find()) count++;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
int count = 0;
Pattern pattern = Pattern.compile(String.format("(%s)", t), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(s);
while(matcher.find()) {
	count++;
}
;;; s=str, t=pattern
(defun cnt_substr (str pattern)
  (loop for i from 0 to (- (length str) (length pattern) ) 
    sum (if (equal pattern (subseq str i (+ i (length pattern )))) 1  0 )))