Given a string S, we need to write a program to check if it is possible to construct the given string S by performing any of the below operations any number of times. In each step, we can:
- Add any character at the end of the string.
- or, append the string to the string itself.
The above steps can be applied any number of times. We need to write a program to print the minimum steps required to form the string. Examples:
Input : aaaaaaaa Output : 4 Explanation: move 1: add 'a' to form "a" move 2: add 'a' to form "aa" move 3: append "aa" to form "aaaa" move 4: append "aaaa" to form "aaaaaaaa" Input: aaaaaa Output: 4 Explanation: move 1: add 'a' to form "a" move 2: add 'a' to form "aa" move 3: add 'a' to form "aaa" move 4: append "aaa" to form "aaaaaa" Input: abcabca Output: 5
The idea to solve this problem is to use Dynamic Programming to count the minimum number of moves. Create an array named dp of size n, where n is the length of the input string. dp[i] stores the minimum number of moves that are required to make substring (0…i). According to the question there are two moves that are possible:
- dp[i] = min(dp[i], dp[i-1] + 1) which signifies addition of characters.
- dp[i*2+1] = min(dp[i]+1, dp[i*2+1]), appending of string is done if s[0…i]==s[i+1..i*2+1]
The answer will be stored in dp[n-1] as we need to form the string(0..n-1) index-wise.Â
Below is the implementation of the above idea:
C++
// CPP program to print the // Minimal moves to form a string // by appending string and adding characters #include <bits/stdc++.h> using namespace std; Â
// function to return the minimal number of moves int minimalSteps(string s, int n) { Â
    int dp[n]; Â
    // initializing dp[i] to INT_MAX     for ( int i = 0; i < n; i++)         dp[i] = INT_MAX; Â
    // initialize both strings to null     string s1 = "" , s2 = "" ;          // base case     dp[0] = 1; Â
    s1 += s[0]; Â
    for ( int i = 1; i < n; i++) {         s1 += s[i]; Â
        // check if it can be appended         s2 = s.substr(i + 1, i + 1); Â
        // addition of character takes one step         dp[i] = min(dp[i], dp[i - 1] + 1); Â
        // appending takes 1 step, and we directly         // reach index i*2+1 after appending         // so the number of steps is stored in i*2+1         if (s1 == s2)             dp[i * 2 + 1] = min(dp[i] + 1, dp[i * 2 + 1]);     } Â
    return dp[n - 1]; } Â
// Driver Code int main() { Â
    string s = "aaaaaaaa" ;     int n = s.length(); Â
    // function call to return minimal number of moves     cout << minimalSteps(s, n); Â
    return 0; } |
Java
// Java program to print the // Minimal moves to form a string // by appending string and adding characters import java.util.*; Â
class GFG { Â
// function to return the minimal number of moves static int minimalSteps(String s, int n) { Â
    int []dp = new int [n];          // initializing dp[i] to INT_MAX     for ( int i = 0 ; i < n; i++)         dp[i] = Integer.MAX_VALUE; Â
    // initialize both strings to null     String s1 = "" , s2 = "" ;          // base case     dp[ 0 ] = 1 ; Â
    s1 += s.charAt( 0 ); Â
    for ( int i = 1 ; i < n; i++)     {         s1 += s.charAt(i); Â
        // check if it can be appended         s2 = s.substring(i + 1 , i + 1 ); Â
        // addition of character takes one step         dp[i] = Math.min(dp[i], dp[i - 1 ] + 1 ); Â
        // appending takes 1 step, and we directly         // reach index i*2+1 after appending         // so the number of steps is stored in i*2+1         if (s1 == s2)             dp[i * 2 + 1 ] = Math.min(dp[i] + 1 ,                                    dp[i * 2 + 1 ]);     }     return dp[n - 1 ]; } Â
// Driver Code public static void main(String args[]) { Â
    String s = "aaaaaaaa" ;     int n = s.length(); Â
    // function call to return minimal number of moves     System.out.println(minimalSteps(s, n)/ 2 ); } } Â
// This code is contributed by // Shashank_Sharma |
Python3
# Python program to print the # Minimal moves to form a string # by appending string and adding characters Â
INT_MAX = 100000000 Â
# function to return the # minimal number of moves def minimalSteps(s, n):     dp = [INT_MAX for i in range (n)]          # initialize both strings to null     s1 = ""     s2 = ""          # base case     dp[ 0 ] = 1     s1 + = s[ 0 ]          for i in range ( 1 , n):         s1 + = s[i]              # check if it can be appended         s2 = s[i + 1 : i + 1 + i + 1 ]              # addition of character         # takes one step         dp[i] = min (dp[i], dp[i - 1 ] + 1 )              # appending takes 1 step, and         # we directly reach index i*2+1         # after appending so the number         # of steps is stored in i*2+1         if (s1 = = s2):             dp[i * 2 + 1 ] = min (dp[i] + 1 ,                                 dp[i * 2 + 1 ])          return dp[n - 1 ] Â
# Driver Code s = "aaaaaaaa" n = len (s) Â
# function call to return # minimal number of moves print ( minimalSteps(s, n) ) Â
# This code is contributed # by sahilshelangia |
C#
// C# program to print the // Minimal moves to form a string // by appending string and adding characters using System; Â Â Â Â Â class GFG { Â
// function to return the minimal number of moves static int minimalSteps(String s, int n) { Â
    int []dp = new int [n];          // initializing dp[i] to INT_MAX     for ( int i = 0; i < n; i++)         dp[i] = int .MaxValue; Â
    // initialize both strings to null     String s1 = "" , s2 = "" ;          // base case     dp[0] = 1; Â
    s1 += s[0]; Â
    for ( int i = 1; i < n; i++)     {         s1 += s[i]; Â
        // check if it can be appended         s2 = s.Substring(i , 1); Â
        // addition of character takes one step         dp[i] = Math.Min(dp[i], dp[i - 1] + 1); Â
        // appending takes 1 step, and we directly         // reach index i*2+1 after appending         // so the number of steps is stored in i*2+1         if (s1 == s2)             dp[i * 2 + 1] = Math.Min(dp[i] + 1,                                 dp[i * 2 + 1]);     }     return dp[n - 1]; } Â
// Driver Code public static void Main(String []args) { Â
    String s = "aaaaaaaa" ;     int n = s.Length; Â
    // function call to return minimal number of moves     Console.Write(minimalSteps(s, n)/2); } } Â
// This code has been contributed by 29AjayKumar |
PHP
<?php // php program to print the // Minimal moves to form a // string by appending string // and adding characters Â
// function to return the // minimal number of moves function minimalSteps( $s , $n ) { Â
    // initializing dp[i] to INT_MAX     for ( $i = 0; $i < $n ; $i ++)         $dp [ $i ] = PHP_INT_MAX; Â
    // initialize both     // strings to null     $s1 = "" ;     $s2 = "" ;          // base case     $dp [0] = 1; Â
    $s1 = $s1 . $s [0]; Â
    for ( $i = 1; $i < $n ; $i ++)     {         $s1 = $s1 . $s [ $i ]; Â
        // check if it can         // be appended         $s2 = substr ( $s , $i + 1, $i + 1); Â
        // addition of character         // takes one step         $dp [ $i ] = min( $dp [ $i ],                   $dp [ $i - 1] + 1); Â
        // appending takes 1 step,         // and we directly         // reach index i*2+1         // after appending         // so the number of steps         // is stored in i*2+1         if ( $s1 == $s2 )             $dp [ $i * 2 + 1] = min( $dp [ $i ] + 1,                               $dp [ $i * 2 + 1]);     } Â
    return $dp [ $n - 1]; } Â
    // Driver Code     $s = "aaaaaaaa" ;     $n = strlen ( $s ); Â
    // function call to return     //minimal number of moves     echo minimalSteps( $s , $n ); Â
// This code is contributed by mits ?> |
Javascript
// Javascript program to print the // Minimal moves to form a string // by appending string and adding characters Â
// function to return the minimal number of moves function minimalSteps(s, n) { Â Â Â Â let dp = [n] Â
    // initializing dp[i] to INT_MAX     for (let i = 0; i < n; i++)         dp[i] = Number.MAX_SAFE_INTEGER Â
    // initialize both strings to null     let s1 = ""     let s2 = ""          // base case     dp[0] = 1 Â
    s1 += s[0] Â
    for (let i = 1; i < n; i++) {         s1 += s[i] Â
        // check if it can be appended         s2 = s.substr(i + 1, i + 1); Â
        // addition of character takes one step         dp[i] = Math.min(dp[i], dp[i - 1] + 1); Â
        // appending takes 1 step, and we directly         // reach index i*2+1 after appending         // so the number of steps is stored in i*2+1         if (s1 == s2)             dp[i * 2 + 1] = Math.min(dp[i] + 1, dp[i * 2 + 1])     } Â
    return dp[n - 1] } Â
// Driver Code let s = "aaaaaaaa" let n = s.length Â
// function call to return minimal number of moves console.log(minimalSteps(s, n)) Â
// This code is contributed by Samim Hossain Mondal. |
4
Time Complexity: O(n2), where n is the length of the input 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!