Open In App

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

Last Updated : 09 Sep, 2022
Comments
Improve
Suggest changes
Like Article
Like
Report

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:
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++
// C++ program to find substring with  
#include <bits/stdc++.h>
using namespace std;

// Function to create prefix array
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 query
int query(int pref[], int l, int r)
{
    return pref[r] - pref[l];
}

// Driver Code
int 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
 // Java program to find substring with 

import java.io.*;

class GFG {

// Function to create prefix array
static 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 query
static 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
# Python3 program for the given approach

# Function to create prefix array 
def 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 query 
def 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#
// C# program to find substring with 

using System;

class GFG {


// Function to create prefix array
static 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 query
static 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 
// PHP program to find substring with 

// Function to create prefix array
function 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 query
function 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
?>
JavaScript
<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>

Output
1
4

Complexity Analysis:

  • Time Complexity: O(n+k) where n is the size of the string and k is the number of queries.
  • Auxiliary Space: O(n)

Next Article

Similar Reads