Converting one string to other using append and delete last operations
Last Updated :
02 Aug, 2022
Given an integer k and two strings str1 and str2 determine whether or not we can convert str1 to str2 by performing exactly k of the below operations on str1.
- Append a lowercase English alphabetic letter to the end of the str1.
- Delete the last character in str1 (Performing this operation on an empty string results in an empty string)
Examples:
Input : k = 7, str1 = aba, str2 = aba
Output : Yes
(4 operations to convert str1 to an
empty string(to make string empty we
have to perform one more delete
operation) and 3 append operations)
Input : k = 5, str1 = pqruvs, str2 = pqrxy
Output : Yes
(3 delete operations and 2 append operations)
First of all we determine the common prefix of both strings and then depending upon the value of common prefix, str1.length, str2.length and k we can conclude result. Below are the cases.
- CASE A: Cases where we can change str1 to str2 :
- If str1.length + str2.length <= k then we can delete str1 completely and re-construct str2 easily.
- If [k-(str1.length-prefix.length + str2.length-prefix.length)] is even then we can easily construct str2 from str1. This is because str1.length-prefix.length is number of letter to be deleted and str2.length-prefix.length is number of letter to be added in str1 after deletion of uncommon letter. After this if the operations left is even then we can add and remove any random letter which cost even number of operations.
- CASE B: In rest of all cases we cannot construct str2 from str1.
Implementation:
C++
// CPP Program to convert str1 to str2 in
// exactly k operations
#include <bits/stdc++.h>
using namespace std;
// Returns true if it is possible to convert
// str1 to str2 using k operations.
bool isConvertible(string str1, string str2,
int k)
{
// Case A (i)
if ((str1.length() + str2.length()) < k)
return true;
// finding common length of both string
int commonLength = 0;
for (int i = 0; i < min(str1.length(),
str2.length()); i++) {
if (str1[i] == str2[i])
commonLength++;
else
break;
}
// Case A (ii)-
if ((k - str1.length() - str2.length() +
2 * commonLength) % 2 == 0)
return true;
// Case B-
return false;
}
// driver program
int main()
{
string str1 = "geek", str2 = "geek";
int k = 7;
if (isConvertible(str1, str2, k))
cout << "Yes";
else
cout << "No";
str1 = "geeks", str2 = "geek";
k = 5;
cout << endl;
if (isConvertible(str1, str2, k))
cout << "Yes";
else
cout << "No";
return 0;
}
Java
// java Program to convert str1 to
// str2 in exactly k operations
import java.io.*;
class GFG {
// Returns true if it is possible to convert
// str1 to str2 using k operations.
static boolean isConvertible(String str1, String str2,
int k)
{
// Case A (i)
if ((str1.length() + str2.length()) < k)
return true;
// finding common length of both string
int commonLength = 0;
for (int i = 0; i < Math.min(str1.length(),
str2.length()); i++)
{
if (str1 == str2)
commonLength++;
else
break;
}
// Case A (ii)-
if ((k - str1.length() - str2.length() +
2 * commonLength) % 2 == 0)
return true;
// Case B
return false;
}
// Driver program
public static void main (String[] args)
{
String str1 = "geek";
String str2 = "geek";
int k = 7;
if (isConvertible(str1, str2, k))
System.out.println( "Yes");
else
System.out.println ( "No");
str1 = "geeks";
str2 = "geek";
k = 5;
if (isConvertible(str1, str2, k))
System.out.println( "Yes");
else
System.out.println ( "No");
}
}
// This code is contributed by vt_m.
Python3
# Python 3 Program to convert str1 to
# str2 in exactly k operations
# Returns true if it is possible to convert
# str1 to str2 using k operations.
def isConvertible(str1, str2, k):
# Case A (i)
if ((len(str1) + len(str2)) < k):
return True
# finding common length of both string
commonLength = 0
for i in range(0, min(len(str1),
len(str2)), 1):
if (str1[i] == str2[i]):
commonLength += 1
else:
break
# Case A (ii)-
if ((k - len(str1) - len(str2) + 2 *
commonLength) % 2 == 0):
return True
# Case B-
return False
# Driver Code
if __name__ == '__main__':
str1 = "geek"
str2 = "geek"
k = 7
if (isConvertible(str1, str2, k)):
print("Yes")
else:
print("No")
str1 = "geeks"
str2 = "geek"
k = 5
if (isConvertible(str1, str2, k)):
print("Yes")
else:
print("No")
# This code is contributed by
# Sanjit_Prasad
C#
// C# Program to convert str1 to
// str2 in exactly k operations
using System;
class GFG {
// Returns true if it is possible to convert
// str1 to str2 using k operations.
static bool isConvertible(string str1, string str2,
int k)
{
// Case A (i)
if ((str1.Length + str2.Length) < k)
return true;
// finding common length of both string
int commonLength = 0;
for (int i = 0; i < Math.Min(str1.Length,
str2.Length); i++)
{
if (str1 == str2)
commonLength++;
else
break;
}
// Case A (ii)-
if ((k - str1.Length - str2.Length +
2 * commonLength) % 2 == 0)
return true;
// Case B
return false;
}
// Driver program
public static void Main ()
{
string str1 = "geek";
string str2 = "geek";
int k = 7;
if (isConvertible(str1, str2, k))
Console.WriteLine( "Yes");
else
Console.WriteLine ( "No");
str1 = "geeks";
str2 = "geek";
k = 5;
if (isConvertible(str1, str2, k))
Console.WriteLine( "Yes");
else
Console.WriteLine ( "No");
}
}
// This code is contributed by vt_m.
PHP
<?php
// PHP Program to convert str1 to str2 in
// exactly k operations
// Returns true if it is possible to convert
// str1 to str2 using k operations.
function isConvertible($str1, $str2, $k)
{
// Case A (i)
if ((strlen($str1) + strlen($str2)) < $k)
return true;
// finding common length of both string
$commonLength = 0;
for ($i = 0; $i < min(strlen($str1),
strlen($str2)); $i++)
{
if ($str1 == $str2)
$commonLength += 1;
else
break;
}
// Case A (ii)-
if (($k - strlen($str1) - strlen($str2) +
2 * $commonLength) % 2 == 0)
return true;
// Case B
return false;
}
// Driver Code
$str1 = "geek";
$str2 = "geek";
$k = 7;
if (isConvertible($str1, $str2, $k))
echo "Yes" . "\n";
else
echo "No" . "\n";
$str1 = "geeks";
$str2 = "geek";
$k = 5;
if (isConvertible($str1, $str2, $k))
echo "Yes" . "\n";
else
echo "No" . "\n";
// This code is contributed by
// Mukul Singh
?>
JavaScript
<script>
// Javascript Program to convert str1 to str2 in
// exactly k operations
// Returns true if it is possible to convert
// str1 to str2 using k operations.
function isConvertible(str1, str2, k)
{
// Case A (i)
if ((str1.length + str2.length) < k)
return true;
// finding common length of both string
var commonLength = 0;
for (var i = 0; i < Math.min(str1.length,
str2.length); i++) {
if (str1[i] == str2[i])
commonLength++;
else
break;
}
// Case A (ii)-
if ((k - str1.length - str2.length +
2 * commonLength) % 2 == 0)
return true;
// Case B-
return false;
}
// driver program
var str1 = "geek", str2 = "geek";
var k = 7;
if (isConvertible(str1, str2, k))
document.write( "Yes");
else
document.write( "No");
str1 = "geeks", str2 = "geek";
k = 5;
document.write("<br>");
if (isConvertible(str1, str2, k))
document.write( "Yes");
else
document.write("No");
// This code is contributed by noob2000.
</script>
Time Complexity: O(n)
Auxiliary Space: O(1)
Similar Reads
Difference between concatenation of strings using (str += s) and (str = str + s) A string is a collection of characters. For example, "GeeksforGeeks" is a string. C++ provides primitive data types to create a string. The string can also be initialized at the time of declaration. Syntax: string str; string str = "GeeksforGeeks" Here, "GeeksforGeeks" is a string literal. This arti
15+ min read
Modify a string by performing given shift operations Given a string S containing lowercase English alphabets, and a matrix shift[][] consisting of pairs of the form{direction, amount}, where the direction can be 0 (for left shift) or 1 (for right shift) and the amount is the number of indices by which the string S is required to be shifted. The task i
6 min read
Final string after performing given operations Given a string str containing only characters x and y, the task is to perform the following operations while possible: Find an index such that s[i] = 'x' and s[i+1] = 'y' and delete both the characters s[i] and s[i+1], if no such index is found then find an index such that s[i] = 'y' and s[i+1] = 'x
6 min read
std::string::append vs std::string::push_back() vs Operator += in C++ To append characters, you can use operator +=, append(), and push_back(). All of them helps to append character but with a little difference in implementation and application. Operator += : appends single-argument values. Time complexity : O(n)append() : lets you specify the appended value by using
6 min read
Minimum operation require to make first and last character same Given a string S. You are allowed two types of operations: Remove a character from the front of the string.Remove a character from the end of the string. The task is to find the minimum operations required to make the first and last character of the S same. In case, it is not possible, print "-1". E
14 min read