// Non‑overlapping occurrences are matches of a substring that do not reuse any of
// the same characters. Once one match is counted, the next search must begin
// after that match ends.
function count_non_overlapping(haystack, needle) {
/*
Count how many times 'needle' appears in 'haystack' without overlapping.
The algorithm:
• Use indexOf() to locate the next occurrence.
• Each time a match is found, move the search index forward
by the full length of the matched substring.
• This ensures no characters are reused between matches.
*/
let count = 0;
let index = 0; // current search position in the main string
// Continue searching until indexOf() returns -1 (meaning: no more matches)
while (true) {
// Find the next occurrence starting at the current index
const pos = haystack.indexOf(needle, index);
if (pos === -1) {
// No more matches found
break;
}
// We found a match, so increment the count
count++;
// Move index forward by the length of the needle
// This ensures the next search begins *after* the matched substring
index = pos + needle.length;
}
return count;
}
// ---------------------------------------------------------------
// Demonstration using the string provided in the instructions:
const s = 'go java phphp rust c pphpp c++ phpphp python php phphp';
const substring = 'php';
// Count non-overlapping occurrences
const result = count_non_overlapping(s, substring);
console.log("Non-overlapping occurrences:", result);
/*
run:
Non-overlapping occurrences: 6
*/