Given two strings, the task is to find if they are only less than or equal to k edit distance apart. It means that strings are only k edit distance apart when there are only k mismatches.
Print Yes if there are less than or equal to k mismatches, Else No.
Also, print yes if both strings are already the same.
Examples:
Input : str1 = "geeksforgeeks" str2 = "geeksforgeek" k = 1 Output : Yes Explanation: Only one character is mismatched or to be removed i.e. s at last Input : str1 = "nishant" str2 = "nisha" k = 1 Output : No Explanation: 2 characters need to be removed i.e. n and t Input : str1 = "practice" str2 = "prac" k = 3 Output : No Explanation: 4 characters are mismatched or to be removed i.e. t, i, c, e at last i.e. > k Input : str1 = "Ping" str2 = "Paging" k = 2 Output : Yes Explanation: 2 characters need to be removed or mismatched i.e. a and g in paging
Algorithm:
- Check if the difference in the length of both strings is greater than k. If so, return false.
- Find the edit distance of two strings. If the edit distance is less than or equal to k, return true. Else return false.
Implementation:
C++
// A Dynamic Programming based C++ program to // find minimum number operations is less than // or equal to k or not to convert str1 to str2 #include <bits/stdc++.h> using namespace std;
// Utility function to find minimum of three numbers int min( int x, int y, int z)
{ return min(min(x, y), z);
} int editDistDP(string str1, string str2, int m, int n)
{ // Create a table to store results of subproblems
int dp[m + 1][n + 1];
// Fill d[][] in bottom up manner
for ( int i = 0; i <= m; i++) {
for ( int j = 0; j <= n; j++) {
// If first string is empty, only option is to
// insert all characters of second string
if (i == 0)
dp[i][j] = j; // Min. operations = j
// If second string is empty, only option is to
// remove all characters of second string
else if (j == 0)
dp[i][j] = i; // Min. operations = i
// If last characters are same, ignore last char
// and recur for remaining string
else if (str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i - 1][j - 1];
// If last character are different, consider all
// possibilities and find minimum
else
dp[i][j] = 1 + min(dp[i][j - 1], // Insert
dp[i - 1][j], // Remove
dp[i - 1][j - 1]); // Replace
}
}
return dp[m][n];
} // Returns true if str1 and str2 are k edit distance apart, // else false. bool areKDistant(string str1, string str2, int k)
{ int m = str1.length();
int n = str2.length();
if ( abs (m - n) > k)
return false ;
return (editDistDP(str1, str2, m, n) <= k);
} // Driver program int main()
{ // your code goes here
string str1 = "geek" ;
string str2 = "gks" ;
int k = 3;
areKDistant(str1, str2, k) ? cout << "Yes" : cout << "No" ;
return 0;
} |
Java
// A Dynamic Programming based Java program to // find minimum number operations is less than // or equal to k or not to convert str1 to str2 class GFG {
// Utility function to find minimum
// of three numbers
static int min( int x, int y, int z)
{
return Math.min(Math.min(x, y), z);
}
static int editDistDP(String str1, String str2,
int m, int n)
{
// Create a table to store
// results of subproblems
int dp[][] = new int [m + 1 ][n + 1 ];
// Fill d[][] in bottom up manner
for ( int i = 0 ; i <= m; i++) {
for ( int j = 0 ; j <= n; j++) {
// If first string is empty,
// only option is to insert
// all characters of second string
if (i == 0 )
dp[i][j] = j; // Min. operations = j
// If second string is empty,
// only option is to remove
// all characters of second string
else if (j == 0 )
dp[i][j] = i; // Min. operations = i
// If last characters are same,
// ignore last char and recur
// for remaining string
else if (str1.charAt(i - 1 ) == str2.charAt(j - 1 ))
dp[i][j] = dp[i - 1 ][j - 1 ];
// If last character are different,
// consider all possibilities
// and find minimum
else
dp[i][j] = 1 + min(dp[i][j - 1 ], // Insert
dp[i - 1 ][j], // Remove
dp[i - 1 ][j - 1 ]); // Replace
}
}
return dp[m][n];
}
// Returns true if str1 and str2 are
// k edit distance apart, else false.
static boolean areKDistant(String str1, String str2,
int k)
{
int m = str1.length();
int n = str2.length();
if (Math.abs(m - n) > k)
return false ;
return (editDistDP(str1, str2, m, n) <= k);
}
// driver code
public static void main(String[] args)
{
String str1 = "geek" ;
String str2 = "gks" ;
int k = 3 ;
if (areKDistant(str1, str2, k))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
} // This code is contributed by Anant Agarwal. |
Python3
# A Dynamic Programming based Python3 program to # find minimum number operations is less than # or equal to k or not to convert str1 to str2 # Utility function to find minimum # of three numbers def minn(x, y, z) :
return min ( min (x, y), z)
def editDistDP(str1, str2, m, n) :
# Create a table to store results
# of subproblems
dp = [[ 0 for i in range (n + 1 )]
for j in range (m + 1 )]
# Fill d[][] in bottom up manner
for i in range (m + 1 ):
for j in range (n + 1 ):
# If first is empty, only option is
# to insert all characters of second
if (i = = 0 ) :
dp[i][j] = j # Min. operations = j
# If second is empty, only option is
# to remove all characters of second
else if (j = = 0 ):
dp[i][j] = i # Min. operations = i
# If last characters are same,
# ignore last char and recur
# for remaining
else if (str1[i - 1 ] = = str2[j - 1 ]):
dp[i][j] = dp[i - 1 ][j - 1 ]
# If last character are different,
# consider all possibilities and
# find minimum
else :
dp[i][j] = 1 + minn(dp[i][j - 1 ], # Insert
dp[i - 1 ][j], # Remove
dp[i - 1 ][j - 1 ]) # Replace
return dp[m][n]
# Returns true if str1 and str2 are # k edit distance apart, else false. def areKDistant(str1, str2, k):
m = len (str1)
n = len (str2)
if ( abs (m - n) > k) :
return False
return (editDistDP(str1, str2,
m, n) < = k)
# Driver Code if __name__ = = '__main__' :
str1 = "geek"
str2 = "gks"
k = 3
if areKDistant(str1, str2, k):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed # by SHUBHAMSINGH10 |
C#
// A Dynamic Programming based C# // program to find minimum number // operations is less than or equal // to k or not to convert str1 to str2 using System;
class GFG
{ // Utility function to find minimum // of three numbers static int min( int x, int y, int z)
{ return Math.Min(Math.Min(x, y), z);
} static int editDistDP( string str1, string str2,
int m, int n)
{ // Create a table to store
// results of subproblems
int [,]dp = new int [m + 1, n + 1];
// Fill d[][] in bottom up manner
for ( int i = 0; i <= m; i++)
{
for ( int j = 0; j <= n; j++)
{
// If first string is empty,
// only option is to insert
// all characters of second string
if (i == 0)
// Min. operations = j
dp[i, j] = j;
// If second string is empty,
// only option is to remove
// all characters of second string
else if (j == 0)
// Min. operations = i
dp[i, j] = i;
// If last characters are same,
// ignore last char and recur
// for remaining string
else if (str1[i - 1] == str2[j - 1])
dp[i, j] = dp[i - 1,j - 1];
// If last character are different,
// consider all possibilities
// and find minimum
else
dp[i, j] = 1 + min(dp[i, j - 1], // Insert
dp[i - 1, j], // Remove
dp[i - 1, j - 1]); // Replace
}
}
return dp[m, n];
} // Returns true if str1 and str2 are // k edit distance apart, else false. static bool areKDistant( string str1, string str2,
int k)
{ int m = str1.Length;
int n = str2.Length;
if (Math.Abs(m - n) > k)
return false ;
return (editDistDP(str1, str2, m, n) <= k);
} // Driver Code public static void Main ()
{ string str1 = "geek" ;
string str2 = "gks" ;
int k = 3;
if (areKDistant(str1, str2, k))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
} } // This code is contributed by vt_m. |
PHP
<?php // A Dynamic Programming based // PHP program to find minimum // number operations is less // than or equal to k or not // to convert str1 to str2 // Utility function to find // minimum of three numbers function minn( $x , $y , $z )
{ return min(minn( $x , $y ), $z );
} function editDistDP( $str1 , $str2 , $m , $n )
{ // Create a table to store
// results of subproblems
$dp [ $m + 1][ $n + 1] = 0;
// Fill d[][] in bottom up manner
for ( $i = 0; $i <= $m ; $i ++)
{
for ( $j = 0; $j <= $n ; $j ++)
{
// If first string is empty,
// only option is to insert
// all characters of second string
if ( $i == 0)
// Min. operations = j
$dp [ $i ][ $j ] = $j ;
// If second string is empty,
// only option is to remove all
// characters of second string
else if ( $j == 0)
// Min. operations = i
$dp [ $i ][ $j ] = $i ;
// If last characters are same,
// ignore last char and recur
// for remaining string
else if ( $str1 [ $i - 1] == $str2 [ $j - 1])
$dp [ $i ][ $j ] = $dp [ $i - 1][ $j - 1];
// If last character are different,
// consider all possibilities and
// find minimum
else
// Insert
$dp [ $i ][ $j ] = 1 + min( $dp [ $i ][ $j - 1],
// Remove
$dp [ $i - 1][ $j ],
// Replace
$dp [ $i - 1][ $j - 1]);
}
}
return $dp [ $m ][ $n ];
} // Returns true if str1 and // str2 are k edit distance // apart, else false. function areKDistant( $str1 , $str2 , $k )
{ $m = strlen ( $str1 );
$n = strlen ( $str2 );
if ( abs ( $m - $n ) > $k )
return false;
return (editDistDP( $str1 , $str2 ,
$m , $n ) <= $k );
} // Driver Code $str1 = "geek" ;
$str2 = "gks" ;
$k = 3;
if (areKDistant( $str1 , $str2 , $k ))
echo "Yes" ;
else echo "No" ;
// This code is contributed by nitin mittal. ?> |
Javascript
<script> // A Dynamic Programming based Javascript program to
// find minimum number operations is less than
// or equal to k or not to convert str1 to str2
// Utility function to find minimum
// of three numbers
function min(x, y, z)
{
return Math.min(Math.min(x, y), z);
}
function editDistDP(str1, str2, m, n)
{
// Create a table to store
// results of subproblems
let dp = new Array(m + 1);
// Fill d[][] in bottom up manner
for (let i = 0; i <= m; i++) {
dp[i] = new Array(n + 1);
for (let j = 0; j <= n; j++) {
// If first string is empty,
// only option is to insert
// all characters of second string
if (i == 0)
dp[i][j] = j; // Min. operations = j
// If second string is empty,
// only option is to remove
// all characters of second string
else if (j == 0)
dp[i][j] = i; // Min. operations = i
// If last characters are same,
// ignore last char and recur
// for remaining string
else if (str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i - 1][j - 1];
// If last character are different,
// consider all possibilities
// and find minimum
else
dp[i][j] = 1 + min(dp[i][j - 1], // Insert
dp[i - 1][j], // Remove
dp[i - 1][j - 1]); // Replace
}
}
return dp[m][n];
}
// Returns true if str1 and str2 are
// k edit distance apart, else false.
function areKDistant(str1, str2, k)
{
let m = str1.length;
let n = str2.length;
if (Math.abs(m - n) > k)
return false ;
return (editDistDP(str1, str2, m, n) <= k);
}
let str1 = "geek" ;
let str2 = "gks" ;
let k = 3;
if (areKDistant(str1, str2, k))
document.write( "Yes" );
else
document.write( "No" );
</script> |
Output
Yes
Time Complexity : O(n*m), where n and m are length od string1 and string2 respectively.
Auxiliary Space : O(n*m), since we used dp[][] matrix of size n*m.
Recommended Articles