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 movesint 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 Codeint 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 charactersimport java.util.*;Â
class GFG{Â
// function to return the minimal number of movesstatic 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 Codepublic 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 charactersusing System;Â Â Â Â Â class GFG{Â
// function to return the minimal number of movesstatic 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 Codepublic 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 movesfunction 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 movesfunction 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 Codelet s = "aaaaaaaa"let n = s.lengthÂ
// function call to return minimal number of movesconsole.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!
