Minimum cost to construct a string
Given a string s (containing lowercase letters only), we have to find the minimum cost to construct the given string. The cost can be determined using the following operations:
- Appending a single character cost 1 unit
- A sub-string of a new string(intermediate string) can be appended without any cost
Note* Intermediate string is the string formed so far.
Examples:
Input : "geks"
Output : cost: 4
Explanation:
appending 'g' cost 1, string "g"
appending 'e' cost 1, string "ge"
appending 'k' cost 1, string "gek"
appending 's' cost 1, string "geks"
Hence, Total cost to construct "geks" is 4
Input : "abab"
Output : cost: 2
Explanation:
Appending 'a' cost 1, string "a"
Appending 'b' cost 1, string "ab"
Appending "ab" cost nothing as it
is substring of intermediate.
Hence, Total cost to construct "abab" is 2
Naive Approach: Check if there is a sub-string in the remaining string to be constructed which is also a sub-string in the intermediate string, if there is then append it at no cost and if not then append it at the cost of 1 unit per character.
In the above example when the intermediate string was “ab” and we need to construct “abab” then the remaining string was “ab”. Hence there is a sub-string in the remaining string which is also a sub-string of intermediate string (i.e. “ab”) and therefore costs us nothing.
Better Approach: We will use hashing technique, to maintain whether we have seen a character or not. If we have seen the character, then there is no cost to append the character and if not, then it cost us 1 unit.
Now in this approach, we take one character at a time and not a string. This is because if “ab” is substring of “abab”, so is ‘a’ and ‘b’ alone and hence make no difference.
This also leads us to the conclusion that the cost to construct a string is never more than 26 in case the string contains all the alphabets (a-z).
Implementation:
C++
#include <iostream>
using namespace std;
int minCost(string& s)
{
bool alphabets[26] = { false };
for ( int i = 0; i < s.size(); i++)
alphabets[s[i] - 97] = true ;
int count = 0;
for ( int i = 0; i < 26; i++)
if (alphabets[i])
count++;
return count;
}
int main()
{
string s = "geks" ;
cout << "Total cost to construct "
<< s << " is " << minCost(s);
return 0;
}
|
Java
class GFG
{
static int minCost( char [] s)
{
boolean alphabets[] = new boolean [ 26 ];
for ( int i = 0 ; i < s.length; i++)
{
alphabets[( int ) s[i] - 97 ] = true ;
}
int count = 0 ;
for ( int i = 0 ; i < 26 ; i++)
{
if (alphabets[i])
{
count++;
}
}
return count;
}
public static void main(String[] args)
{
String s = "geeksforgeeks" ;
System.out.println( "Total cost to construct " +
s + " is " + minCost(s.toCharArray()));
}
}
|
Python3
def minCost(s):
alphabets = [ False for i in range ( 26 )]
for i in range ( len (s)):
alphabets[ ord (s[i]) - 97 ] = True
count = 0
for i in range ( 26 ):
if (alphabets[i]):
count + = 1
return count
if __name__ = = '__main__' :
s = "geeksforgeeks"
print ( "Total cost to construct" , s,
"is" , minCost(s))
|
C#
using System;
class GFG
{
static int minCost( char [] s)
{
bool []alphabets = new bool [26];
for ( int i = 0; i < s.Length; i++)
{
alphabets[( int ) s[i] - 97] = true ;
}
int count = 0;
for ( int i = 0; i < 26; i++)
{
if (alphabets[i])
{
count++;
}
}
return count;
}
public static void Main(String[] args)
{
String s = "geeksforgeeks" ;
Console.WriteLine( "Total cost to construct " +
s + " is " + minCost(s.ToCharArray()));
}
}
|
Javascript
<script>
function minCost(s)
{
var alphabets = new Array(26).fill(0);
for ( var i = 0; i < s.length; i++) {
alphabets[s[i].charCodeAt(0) - 97] = true ;
}
var count = 0;
for ( var i = 0; i < 26; i++) {
if (alphabets[i]) {
count++;
}
}
return count;
}
var s = "geeksforgeeks" ;
document.write(
"Total cost to construct " + s + " is " + minCost(s.split( "" ))
);
</script>
|
Output
Total cost to construct geeksforgeeks is 1
Time Complexity: O(n)
Auxiliary Space: O(1)
Last Updated :
15 Feb, 2024
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...