Open In App

Find sub-string with given power

Improve
Improve
Like Article
Like
Save
Share
Report

Given a string of lowercase alphabets, the task is to find indexes of a substring with given power. Assume power of a to be 1, b to be 2, c to be 3 and so on. Here the power of a substring means the sum of the powers of all the characters in that particular substring.

Examples:  

Input: str = “geeksforgeeks” power = 36 
Output: Substring from index 3 to 5 has power 36 

Explanation: k = 11, s = 19, f = 6 i.e. k + s + e = 36.
Input: str = “aditya” power = 2 
Output: No substring with given power exists.  

Simple Approach: 

  1. Calculate powers of all substrings using nested for loops. 
  2. If the power of any substring equals the given power then print the indexes of the substring. 
  3. If no such substring exists then print “No substring with given power exists”.

Time Complexity: O (n ^ 2).
Efficient Approach: Use map to store the powers.

  1. For each element check if curr_power – power exists in the map or not. 
  2. If it exists in the map it means that we have a substring present with given power, else we insert curr_power into the map and proceed to the next character. 
  3. If all characters of the string are processed and we didn’t find any substring with given power, then substring doesn’t exist. 

Implementation:

C++




// C++ program to find substring with given power
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
 
// Function to print indexes of substring with
// power as given power.
void findSubstring(string str, ll power)
{
    ll i;
    // Create an empty map
    unordered_map<ll, ll> map;
 
    // Maintains sum of powers of characters so far.
    int curr_power = 0;
    int len = str.length();
 
    for (i = 0; i < len; i++) {
        // Add current character power to curr_power.
        curr_power = curr_power + (str[i] - 'a' + 1);
 
        // If curr_power is equal to target power
        // we found a substring starting from index 0
        // and ending at index i.
        if (curr_power == power) {
            cout << "Substring from index " << 0 << " to "
                 << i << " has power " << power << endl;
            return;
        }
 
        // If curr_power - power already exists in map
        // then we have found a subarray with target power.
        if (map.find(curr_power - power) != map.end()) {
            cout << "Substring from index "
                 << map[curr_power - power] + 1
                 << " to " << i <<" has power " <<power << endl;
            return;
        }
 
        map[curr_power] = i;
    }
 
    // If we reach here, then no substring exists.
    cout << "No substring with given power exists.";
}
 
// Drivers code
int main()
{
    string str = "geeksforgeeks";
    ll power = 36;
 
    findSubstring(str, power);
 
    return 0;
}


Java




// Java program to find substring with given power
import java.util.*;
 
class GFG
{
 
    // Function to print indexes of substring with
    // power as given power.
    static void findSubstring(String str, int power)
    {
 
        // Create an empty map
        HashMap<Integer,
                Integer> map = new HashMap<>();
 
        // Maintains sum of powers of characters so far.
        int curr_power = 0;
        int len = str.length();
 
        for (int i = 0; i < len; i++)
        {
 
            // Add current character power to curr_power.
            curr_power = curr_power + (str.charAt(i) - 'a' + 1);
 
            // If curr_power is equal to target power
            // we found a substring starting from index 0
            // and ending at index i.
            if (curr_power == power)
            {
                System.out.println("Substring from index 0" +
                                   " to " + i + " has power " + power);
                return;
            }
 
            // If curr_power - power already exists in map
            // then we have found a subarray with target power.
            if (map.containsKey(curr_power - power))
            {
                System.out.println("Substring from index " +
                                  (map.get(curr_power - power) + 1) +
                                 " to " + i + " has power " + power);
                return;
            }
 
            map.put(curr_power, i);
        }
 
        // If we reach here, then no substring exists.
        System.out.println("No substring with given power exists.");
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        String str = "geeksforgeeks";
        int power = 36;
 
        findSubstring(str, power);
    }
}
 
// This code is contributed by
// sanjeev2552


Python3




# Python program to find substring with given power
 
# Function to print indexes of substring with
# power as given power.
def findSubstring(Str,power):
 
    map = {}
 
    # Maintains sum of powers of characters so far.
    curr_power = 0
    Len = len(Str)
 
    for i in range(Len):
 
        # Add current character power to curr_power.
        curr_power = curr_power + (ord(Str[i]) - ord('a') + 1)
 
        # If curr_power is equal to target power
        # we found a substring starting from index 0
        # and ending at index i.
        if (curr_power == power):
         
            print("Substring from index 0 to " + str(i) + " has power " + str(power))
            return
 
        # If curr_power - power already exists in map
        # then we have found a subarray with target power.
        if (curr_power - power in map):
             
            print("Substring from index " +str(map[curr_power - power] + 1) + " to " + str(i) + " has power " + str(power))
            return
 
        map[curr_power] = i
 
    # If we reach here, then no substring exists.
    print("No substring with given power exists.")
 
# Driver Code
Str = "geeksforgeeks"
power = 36
 
findSubstring(Str, power)
 
# This code is contributed by shinjanpatra


C#




// C# program to find substring
// with given power
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Function to print indexes of substring
    // with power as given power.
    static void findSubstring(String str,
                              int power)
    {
 
        // Create an empty map
        Dictionary<int,
                   int> map = new Dictionary<int,
                                             int>();
 
        // Maintains sum of powers
        // of characters so far.
        int curr_power = 0;
        int len = str.Length;
 
        for (int i = 0; i < len; i++)
        {
 
            // Add current character power
            // to curr_power.
            curr_power = curr_power +
                        (str[i] - 'a' + 1);
 
            // If curr_power is equal to target power
            // we found a substring starting from index 0
            // and ending at index i.
            if (curr_power == power)
            {
                Console.WriteLine("Substring from index 0" +
                                  " to " + i +
                                  " has power " + power);
                return;
            }
 
            // If curr_power - power already exists in map
            // then we have found a subarray with target power.
            if (map.ContainsKey(curr_power - power))
            {
                Console.WriteLine("Substring from index " +
                            (map[curr_power - power] + 1) +
                       " to " + i + " has power " + power);
                return;
            }
             
            if (!map.ContainsKey(curr_power))
                    map.Add(curr_power, i);
            else
                map[curr_power] = i;
        }
 
        // If we reach here, then no substring exists.
        Console.WriteLine("No substring with " +
                          "given power exists");
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        String str = "geeksforgeeks";
        int power = 36;
 
        findSubstring(str, power);
    }
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
// Javascript program to find substring with given power
 
// Function to print indexes of substring with
    // power as given power.
function findSubstring(str,power)
{
    let  map = new Map();
   
        // Maintains sum of powers of characters so far.
        let curr_power = 0;
        let len = str.length;
   
        for (let i = 0; i < len; i++)
        {
   
            // Add current character power to curr_power.
            curr_power = curr_power + (str[i].charCodeAt(0) - 'a'.charCodeAt(0) + 1);
   
            // If curr_power is equal to target power
            // we found a substring starting from index 0
            // and ending at index i.
            if (curr_power == power)
            {
                document.write("Substring from index 0" +
                                   " to " + i + " has power " + power+"<br>");
                return;
            }
   
            // If curr_power - power already exists in map
            // then we have found a subarray with target power.
            if (map.has(curr_power - power))
            {
                document.write("Substring from index " +
                                  (map.get(curr_power - power) + 1) +
                                 " to " + i + " has power " + power+"<br>");
                return;
            }
   
            map.set(curr_power, i);
        }
   
        // If we reach here, then no substring exists.
        document.write("No substring with given power exists.<br>");
}
 
// Driver Code
let str = "geeksforgeeks";
let power = 36;
 
findSubstring(str, power);
 
// This code is contributed by rag2127
</script>


Output

Substring from index 3 to 5 has power 36

Time Complexity: O(n), where n is the length of the given string.
Auxiliary Space: O(n)



Last Updated : 25 Nov, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads