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 = “neveropen” power = 36
Output: Substring from index 3 to 5 has power 36Explanation: 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:
- Calculate powers of all substrings using nested for loops.
- If the power of any substring equals the given power then print the indexes of the substring.
- 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.
- For each element check if curr_power – power exists in the map or not.
- 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.
- 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 = "neveropen" ; 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 = "neveropen" ; 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 = "neveropen" 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 = "neveropen" ; 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 = "neveropen" ; let power = 36; findSubstring(str, power); // This code is contributed by rag2127 </script> |
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)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!