Count number of indices such that s[i] = s[i+1] : Range queries - GeeksforGeeks

25 May, 2021
Given a string str. Now for every query consisting of two integer L and R, the task is to find the number of indices such that str[i] = str[i+1] and L ≤ i, i+1 ≤ R.Examples:  
Input: str = “ggggggggggg”, query[] = {{1, 2}, {1, 5}} Output: 1 4 The answer is 1 for first query and 4 for second query. The condition is true for all indices except the last one in each query.Input: str = “geeg”, query[] = {{0, 3}} Output: 1 The condition is true only for i = 1.  
 
Approach: Create a prefix array pref such that pref[i] holds the count of all the indices from 1 to i-1 such that str[i] = str[i+1]. Now for every query (L, R) the result will be pref[r] – pref[l].Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find substring with #include <bits/stdc++.h>using namespace std; // Function to create prefix arrayvoid preCompute(int n, string s, int pref[]){    pref[0] = 0;    for (int i = 1; i < n; i++) {        pref[i] = pref[i - 1];        if (s[i - 1] == s[i])            pref[i]++;    }} // Function to return the result of the queryint query(int pref[], int l, int r){    return pref[r] - pref[l];} // Driver Codeint main(){    string s = "ggggggg";    int n = s.length();     int pref[n];    preCompute(n, s, pref);     // Query 1    int l = 1;    int r = 2;    cout << query(pref, l, r) << endl;     // Query 2    l = 1;    r = 5;    cout << query(pref, l, r) << endl;     return 0;}
// Java program to find substring with import java.io.*; class GFG { // Function to create prefix arraystatic void preCompute(int n, String s, int pref[]){    pref[0] = 0;    for (int i = 1; i < n; i++) {        pref[i] = pref[i - 1];        if (s.charAt(i - 1)== s.charAt(i))            pref[i]++;    }} // Function to return the result of the querystatic int query(int pref[], int l, int r){    return pref[r] - pref[l];} // Driver Code     public static void main (String[] args) {    String s = "ggggggg";    int n = s.length();     int pref[] = new int[n];    preCompute(n, s, pref);     // Query 1    int l = 1;    int r = 2;    System.out.println( query(pref, l, r));     // Query 2    l = 1;    r = 5;    System.out.println(query(pref, l, r));    }}// This code is contributed by inder_verma..
# Python3 program for the given approach # Function to create prefix arraydef preCompute(n, s, pref):      for i in range(1,n):         pref[i] = pref[i - 1]        if s[i - 1] == s[i]:            pref[i] += 1   # Function to return the result of the querydef query(pref, l, r):      return pref[r] - pref[l]   if __name__ == "__main__":     s = "ggggggg"    n = len(s)       pref = [0] * n    preCompute(n, s, pref)       # Query 1    l = 1    r = 2    print(query(pref, l, r))       # Query 2    l = 1    r = 5    print(query(pref, l, r))     # This code is contributed by Rituraj Jain
// C# program to find substring with using System; class GFG {  // Function to create prefix arraystatic void preCompute(int n, string s, int []pref){    pref[0] = 0;    for (int i = 1; i < n; i++) {        pref[i] = pref[i - 1];        if (s[i - 1]== s[i])            pref[i]++;    }} // Function to return the result of the querystatic int query(int []pref, int l, int r){    return pref[r] - pref[l];} // Driver Code     public static void Main () {    string s = "ggggggg";    int n = s.Length;     int []pref = new int[n];    preCompute(n, s, pref);     // Query 1    int l = 1;    int r = 2;    Console.WriteLine( query(pref, l, r));     // Query 2    l = 1;    r = 5;    Console.WriteLine(query(pref, l, r));    }}// This code is contributed by inder_verma..
<?php// PHP program to find substring with // Function to create prefix arrayfunction preCompute($n, $s, &$pref){    $pref[0] = 0;    for ($i = 1; $i < $n; $i++)    {        $pref[$i] = $pref[$i - 1];        if ($s[$i - 1] == $s[$i])            $pref[$i]++;    }} // Function to return the result of the queryfunction query(&$pref, $l, $r){    return $pref[$r] - $pref[$l];} // Driver Code$s = "ggggggg";$n = strlen($s); $pref = array_fill(0, $n, NULL);preCompute($n, $s, $pref); // Query 1$l = 1;$r = 2;echo query($pref, $l, $r) . "\n"; // Query 2$l = 1;$r = 5;echo query($pref, $l, $r) . "\n"; // This code is contributed by ita_c?>
<script>// Javascript program to find substring with         // Function to create prefix array    function preCompute(n,s,pref)    {        pref[0] = 0;    for (let i = 1; i < n; i++) {        pref[i] = pref[i - 1];        if (s[i - 1]== s[i])            pref[i]++;    }    }         // Function to return the result of the query    function query(pref,l,r)    {        return pref[r] - pref[l];    }         // Driver Code         let s = "ggggggg";    let n = s.length;       let pref = new Array(n);    preCompute(n, s, pref);       // Query 1    let l = 1;    let r = 2;    document.write( query(pref, l, r)+"<br>");       // Query 2    l = 1;    r = 5;    document.write(query(pref, l, r)+"<br>"); // This code is contributed by rag2127</script>
1
4
 
inderDuMCA
rituraj_jain
ukasp
rag2127
array-range-queries
prefix-sum
Strings
prefix-sum
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Top 50 String Coding Problems for Interviews
Vigenère Cipher
How to Append a Character to a String in C
Convert character array to string in C++
Naive algorithm for Pattern Searching
Return maximum occurring character in an input string
Hill Cipher
sprintf() in C
Program to add two binary strings
A Program to check if strings are rotations of each other or not