Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Interview Problems on Hash
  • Practice Hash
  • MCQs on Hash
  • Hashing Tutorial
  • Hash Function
  • Index Mapping
  • Collision Resolution
  • Open Addressing
  • Separate Chaining
  • Quadratic probing
  • Double Hashing
  • Load Factor and Rehashing
  • Advantage & Disadvantage
Open In App
Next Article:
Check if given strings can be made same by swapping two characters of same or different strings
Next article icon

Check if two strings can be made equal by swapping pairs of adjacent characters

Last Updated : 28 Oct, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

Given two strings A and B of length N and M respectively and an array arr[] consisting of K integers, the task is to check if the string B can be obtained from the string A by swapping any pair of adjacent characters of the string A any number of times such that the swapped indices are not present in the array arr[]. If it is possible to convert string A to string B, print "Yes". Otherwise, print "No".

Examples:

Input: A = "abcabka", B = "acbakba", arr[] = {0, 3, 6}
Output: Yes
Explanation:
Swap A1 and A2. Now the string becomes A = "acbabka".
Swap A4 and A5. Now the string becomes A = "acbakba", which is the same as string B.

Input: A = "aaa", B = "bbb", arr[] = {0}
Output : No

Approach: Follow the below steps to solve the problem:

  • If the length of both the strings are not equal, then string A can't be transformed to string B. Therefore, print "No".
  • Traverse the given array arr[] and check if characters at A[arr[i]] and B[arr[i]] are same or not. If found to be true, then print "No". Otherwise, perform the following steps:
    • If the first element of arr[i] is not 0:
      • Store all characters of A and B from 0 to arr[i] in two strings, say X and Y.
      • Find the frequency of characters of string X and Y.
      • If the frequency of all characters is the same, print "No".
    • Similarly, if the last element of arr[i] is not equal to the element at index (N - 1), then:
      • Store all characters of A and B from (arr[i] + 1) to N in two strings, say X and Y.
      • Find the frequency of characters of string X and Y.
      • If the frequency of all characters is the same, print "No".
    • Iterate a loop from 1 to N and initialize two pointers, L = arr[i - 1] and R = arr[i]:
      • Store all characters of A and B from (L + 1) to R in two strings, say X and Y.
      • Find the frequency of characters of string X and Y.
      • If the frequency of all characters is the same, print “Yes”. Otherwise, print “No”.

Below is the implementation of the above approach:

C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;  // Function to count frequency of the // characters of two given strings bool isEqual(string& A, string& B) {     // Stores the frequencies of     // characters of strings A and B     map<char, int> mp, mp1;      // Traverse the string A     for (auto it : A) {          // Update frequency of         // each character         mp[it]++;     }      // Traverse the string B     for (auto it : B) {          // Update frequency of         // each character         mp1[it]++;     }      // Traverse the Map     for (auto it : mp) {          // If the frequency a character         // is not the same in both the strings         if (it.second != mp1[it.first]) {             return false;         }     }      return true; }  // Function to check if it is possible // to convert string A to string B void IsPossible(string& A, string& B,                 int arr[], int N) {      // Base Case     if (A == B) {         cout << "Yes" << endl;         return;     }      // If length of both the     // strings are not equal     if (A.length() != B.length()) {         cout << "No" << endl;         return;     }      // Traverse the array and check     // if the blocked indices     // contains the same character     for (int i = 0; i < N; i++) {         int idx = arr[i];          // If there is a different         // character, return No         if (A[idx] != B[idx]) {             cout << "No" << endl;             return;         }     }      // If the first index is not present     if (arr[0]) {         string X = "";         string Y = "";          // Extract characters from         // string A and B         for (int i = 0; i < arr[0]; i++) {             X += A[i];             Y += B[i];         }          // If frequency is not same         if (!isEqual(A, B)) {              cout << "No" << endl;             return;         }     }      // If last index is not present     if (arr[N - 1] != (A.length() - 1)) {         string X = "";         string Y = "";          // Extract characters from         // string A and B         for (int i = arr[N - 1] + 1;              i < A.length(); i++) {             X += A[i];             Y += B[i];         }          // If frequency is not same         if (!isEqual(A, B)) {             cout << "No" << endl;             return;         }     }      // Traverse the array arr[]     for (int i = 1; i < N; i++) {          int L = arr[i - 1];         int R = arr[i];          string X = "";         string Y = "";          // Extract characters from strings A and B         for (int j = L + 1; j < R; j++) {             X += A[j];             Y += B[j];         }          // If frequency is not same         if (!isEqual(A, B)) {             cout << "No" << endl;             return;         }     }      // If all conditions are satisfied     cout << "Yes" << endl; }  // Driver Code int main() {     string A = "abcabka";     string B = "acbakba";     int arr[] = { 0, 3, 6 };     int N = sizeof(arr) / sizeof(arr[0]);      IsPossible(A, B, arr, N);      return 0; } 
Java
// Java program for the above approach  // importing input-output and utility classes import java.io.*; import java.util.*;  class GFG {     // method to count frequency of the     // characters of two given strings     static boolean isEqual(String A, String B)     {         // storing the frequencies of characters         HashMap<Character, Integer> map = new HashMap<>();         HashMap<Character, Integer> map2 = new HashMap<>();          // Traversing the String A         for (int i = 0; i < A.length(); i++) {             if (map.containsKey(A.charAt(i)))                 map.put(A.charAt(i),                         map.get(A.charAt(i)) + 1);             else                 map.put(A.charAt(i), 1);         }         // Traversing the String B         for (int i = 0; i < B.length(); i++) {             if (map.containsKey(B.charAt(i)))                 map.put(B.charAt(i),                         map.get(B.charAt(i)) + 1);             else                 map.put(B.charAt(i), 1);         }         // checking if both map have same character         // frequency         if (!map.equals(map2))             return false;         return true;     }      // method to check possibility to convert A into B     static void isPossible(String A, String B, int arr[],                            int N)     {         // Base Case         if (A.equals(B)) {             System.out.println("Yes");             return;         }         // If length is not equal         if (A.length() != B.length()) {             System.out.println("No");             return;         }         for (int i = 0; i < N; i++) {             int idx = arr[i];              if (A.charAt(idx) != B.charAt(idx)) {                 System.out.println("No");                 return;             }         }         // If first index is not present         if (arr[0] == 0) {             String X = "";             String Y = "";             // Extracting Characters from A and B             for (int i = 0; i < arr[0]; i++) {                 X += A.charAt(i);                 Y += B.charAt(i);             }             // If frequency is not same             if (!isEqual(A, B)) {                 System.out.println("No");                 return;             }         }         // If last index is not present         if (arr[N - 1] != (A.length() - 1)) {             String X = "";             String Y = "";              for (int i = arr[N - 1] + 1; i < A.length();                  i++) {                 X += A.charAt(i);                 Y += B.charAt(i);             }              if (!isEqual(A, B)) {                 System.out.println("No");                 return;             }         }         // Traversing the Array         for (int i = 1; i < N; i++) {             int L = arr[i - 1];             int R = arr[i - 1];             String X = "";             String Y = "";             // Extract Characters from Strings A and B             for (int j = L + 1; j < R; j++) {                 X += A.charAt(j);                 Y += B.charAt(j);             }             // if frequency is not same             if (!isEqual(A, B)) {                 System.out.println("No");                 return;             }         }         // if all condition satisfied         System.out.println("Yes");     }     // main method     public static void main(String[] args)     {         String A = "abcabka";         String B = "abcabka";         int arr[] = { 0, 3, 6 };         int N = arr.length;         // calling method         isPossible(A, B, arr, N);     } } 
Python3
# Python3 program for the above approach from collections import defaultdict  # Function to count frequency of the # characters of two given strings def isEqual(A, B):          # Stores the frequencies of     # characters of strings A and B     mp = defaultdict(int)     mp1 = defaultdict(int)      # Traverse the string A     for it in A:          # Update frequency of         # each character         mp[it] += 1      # Traverse the string B     for it in B:          # Update frequency of         # each character         mp1[it] += 1      # Traverse the Map     for it in mp:          # If the frequency a character         # is not the same in both the strings         if (mp[it] != mp1[it]):             return False      return True  # Function to check if it is possible # to convert string A to string B def IsPossible(A, B, arr, N):      # Base Case     if (A == B):         print("Yes")         return      # If length of both the     # strings are not equal     if (len(A) != len(B)):         print("No")         return      # Traverse the array and check     # if the blocked indices     # contains the same character     for i in range(N):         idx = arr[i]          # If there is a different         # character, return No         if (A[idx] != B[idx]):             print("No")             return      # If the first index is not present     if (arr[0]):         X = ""         Y = ""          # Extract characters from         # string A and B         for i in range(arr[0]):             X += A[i]             Y += B[i]          # If frequency is not same         if (not isEqual(A, B)):             print("No")             return      # If last index is not present     if (arr[N - 1] != (len(A) - 1)):         X = ""         Y = ""          # Extract characters from         # string A and B         for i in range(arr[N - 1] + 1,                        len(A)):             X += A[i]             Y += B[i]          # If frequency is not same         if (not isEqual(A, B)):             print("No")             return      # Traverse the array arr[]     for i in range(1, N):         L = arr[i - 1]         R = arr[i]          X = ""         Y = ""          # Extract characters from strings A and B         for j in range(L + 1, R):             X += A[j]             Y += B[j]          # If frequency is not same         if (not isEqual(A, B)):             print("No")             return      # If all conditions are satisfied     print("Yes")  # Driver Code if __name__ == "__main__":      A = "abcabka"     B = "acbakba"     arr = [ 0, 3, 6 ]     N = len(arr)      IsPossible(A, B, arr, N)  # This code is contributed by ukasp 
C#
// C# program for the above approach  // importing input-output and utility classes using System; using System.Collections.Generic;  class GFG  {    // method to count frequency of the   // characters of two given strings   static bool isEqual(string A, string B)   {     // storing the frequencies of characters     Dictionary<char, int> map       = new Dictionary<char, int>();     Dictionary<char, int> map2       = new Dictionary<char, int>();      // Traversing the String A     for (int i = 0; i < A.Length; i++) {       if (map.ContainsKey(A[i]))         map[A[i]] = map[A[i]] + 1;       else         map.Add(A[i], 1);     }     // Traversing the String B     for (int i = 0; i < B.Length; i++) {       if (map2.ContainsKey(B[i]))         map2[B[i]] = map2[B[i]] + 1;       else         map2.Add(B[i], 1);     }     // checking if both map have same character     // frequency     if (!map.Equals(map2))       return false;     return true;   }    // method to check possibility to convert A into B   static void isPossible(string A, string B, int[] arr,                          int N)   {      // Base Case     if (A.Equals(B)) {       Console.WriteLine("Yes");       return;     }      // If length is not equal     if (A.Length != B.Length) {       Console.WriteLine("No");       return;     }     for (int i = 0; i < N; i++) {       int idx = arr[i];        if (A[idx] != B[idx]) {         Console.WriteLine("No");         return;       }     }      // If first index is not present     if (arr[0] == 0) {       String X = "";       String Y = "";        // Extracting Characters from A and B       for (int i = 0; i < arr[0]; i++) {         X += A[i];         Y += B[i];       }        // If frequency is not same       if (!isEqual(A, B)) {         Console.WriteLine("No");         return;       }     }      // If last index is not present     if (arr[N - 1] != (A.Length - 1)) {       string X = "";       string Y = "";        for (int i = arr[N - 1] + 1; i < A.Length;            i++) {         X += A[i];         Y += B[i];       }        if (!isEqual(A, B)) {         Console.WriteLine("No");         return;       }     }      // Traversing the Array     for (int i = 1; i < N; i++) {       int L = arr[i - 1];       int R = arr[i - 1];       string X = "";       string Y = "";        // Extract Characters from Strings A and B       for (int j = L + 1; j < R; j++) {         X += A[j];         Y += B[j];       }        // if frequency is not same       if (!isEqual(A, B)) {         Console.WriteLine("No");         return;       }     }      // if all condition satisfied     Console.WriteLine("Yes");   }    // main method   public static void Main()   {     string A = "abcabka";     string B = "abcabka";     int[] arr = { 0, 3, 6 };     int N = arr.Length;      // calling method     isPossible(A, B, arr, N);   } }  // This code is contributed by Samim Hossain Mondal. 
JavaScript
<script>  // Javascript program for the above approach  // Function to count frequency of the // characters of two given strings function isEqual(A, B)  {          // Stores the frequencies of     // characters of strings A and B     let mp = new Map();     let mp1 = new Map();      // Traverse the string A     for(let it of A)     {                  // Update frequency of         // each character         if (mp.has(it))         {             mp.set(it, mp.get(it) + 1)         }          else         {             mp.set(it, 1)         }     }      // Traverse the string B     for(let it of B)     {                  // Update frequency of         // each character         if (mp1.has(it))         {             mp1.set(it, mp1.get(it) + 1)         }          else         {             mp1.set(it, 1)         }     }      // Traverse the Map     for(let it of mp)      {                  // If the frequency a character         // is not the same in both the strings         if (it[1] != mp1.get(it[0]))          {             return false;         }     }     return true; }  // Function to check if it is possible // to convert string A to string B function IsPossible(A, B, arr, N) {          // Base Case     if (A == B)     {         document.write("Yes" + "<br>");         return;     }      // If length of both the     // strings are not equal     if (A.length != B.length)      {         document.write("No" + "<br>");         return;     }      // Traverse the array and check     // if the blocked indices     // contains the same character     for(let i = 0; i < N; i++)      {         let idx = arr[i];          // If there is a different         // character, return No         if (A[idx] != B[idx])         {             document.write("No" + "<br>");             return;         }     }      // If the first index is not present     if (arr[0])      {         let X = "";         let Y = "";          // Extract characters from         // string A and B         for(let i = 0; i < arr[0]; i++)         {             X += A[i];             Y += B[i];         }          // If frequency is not same         if (!isEqual(A, B))         {             document.write("No" + "<br>");             return;         }     }      // If last index is not present     if (arr[N - 1] != (A.length - 1))      {         let X = "";         let Y = "";          // Extract characters from         // string A and B         for(let i = arr[N - 1] + 1;                 i < A.length; i++)         {             X += A[i];             Y += B[i];         }          // If frequency is not same         if (!isEqual(A, B))         {             document.write("No" + "<br>");             return;         }     }      // Traverse the array arr[]     for(let i = 1; i < N; i++)      {         let L = arr[i - 1];         let R = arr[i];         let X = "";         let Y = "";          // Extract characters from strings A and B         for(let j = L + 1; j < R; j++)         {             X += A[j];             Y += B[j];         }          // If frequency is not same         if (!isEqual(A, B))         {             document.write("No" + "<br>");             return;         }     }      // If all conditions are satisfied     document.write("Yes" + "<br>"); }  // Driver Code let A = "abcabka"; let B = "acbakba"; let arr = [ 0, 3, 6 ]; let N = arr.length  IsPossible(A, B, arr, N);  // This code is contributed by gfgking  </script> 

Output
Yes

Time Complexity: O(N)
Auxiliary Space: O(N)

Another Approach:

  1. Check if the length of strings A and B are equal, if not, return false.
  2. Create a 2D boolean dp table of size N x M, where N and M are the length of strings A and B respectively.
  3. Initialize dp[0][0] as true if A[0] == B[0].
  4. Initialize dp[0][j] for j > 0, using the constraints given in the arr vector.
  5. Initialize dp[i][0] for i > 0, using the constraints given in the arr vector.
  6. Fill the remaining cells of the dp table using the given constraints, and the following conditions:
    If A[i] == B[j], then dp[i][j] = dp[i-1][j-1]
    If i > 1 and j > 0 and A[i] == B[j-1] and A[i-1] == B[j] and the constraints allow, then dp[i][j] = dp[i-2][j-2]
    If j > 1 and A[i] == B[j-2] and A[i] == B[j-1] and the constraints allow, then dp[i][j] = dp[i][j-2]
    If i > 1 and A[i] == B[j] and A[i-1] == B[j-1] and the constraints allow, then dp[i][j] = dp[i-2][j-1]
  7. Return the value of dp[N-1][M-1].
  8. In the main function, call the isPossible function with the given input strings A and B, and the array arr.
  9. If isPossible returns true, print "Yes", else print "No".

Below is the implementation of the above approach:

C++
#include <iostream> #include <vector> #include <cstring> using namespace std;  bool isPossible(string A, string B, vector<int> arr) {     int N = A.length();     int M = B.length();     if (N != M) {         return false;     }      // Create a 2D boolean array to store if it is possible to     // transform A[0...i] to B[0...j] with the given constraints     bool dp[N][M];     memset(dp, false, sizeof(dp));      // Initialize dp[0][0] as true if A[0] == B[0]     dp[0][0] = (A[0] == B[0]);      // Initialize dp[0][j] for j > 0     for (int j = 1; j < M; j++) {         dp[0][j] = (A[0] == B[j]);         dp[0][j] = dp[0][j] && (arr[0] != j);         dp[0][j] = dp[0][j] && dp[0][j - 1];     }      // Initialize dp[i][0] for i > 0     for (int i = 1; i < N; i++) {         dp[i][0] = (A[i] == B[0]);         dp[i][0] = dp[i][0] && (arr[0] != i);         dp[i][0] = dp[i][0] && dp[i - 1][0];     }      // Fill the remaining cells of the dp table     for (int i = 1; i < N; i++) {         for (int j = 1; j < M; j++) {             dp[i][j] = false;             if (A[i] == B[j]) {                 dp[i][j] = dp[i][j] || dp[i - 1][j - 1];             }             if (i > 1 && j > 0 && A[i] == B[j - 1] && A[i - 1] == B[j] && arr[j - 1] != j && arr[j] != j - 1) {                 dp[i][j] = dp[i][j] || dp[i - 2][j - 2];             }             if (j > 1) {                 dp[i][j] = dp[i][j] || (A[i] == B[j - 2] && A[i] == B[j - 1] && arr[j - 2] != j && arr[j - 1] != j && dp[i][j - 2]);             }             if (i > 1) {                 dp[i][j] = dp[i][j] || (A[i] == B[j] && A[i - 1] == B[j - 1] && arr[j] != j && arr[j - 1] != j - 1 && dp[i - 2][j - 1]);             }         }     }      return dp[N - 1][M - 1]; }  int main() {     string A = "abcabka";     string B = "acbakba";     vector<int> arr = {0, 3, 6};     if (isPossible(A, B, arr)) {         cout << "Yes\n";     } else {         cout << "No\n";     }      } //This code is contributed by rudra1807raj    
Java
public class Main {      static boolean isPossible(String A, String B, int[] arr) {         int N = A.length();         int M = B.length();          // Create a 2D boolean array to store if it is possible to         // transform A[0...i] to B[0...j] with the given constraints         boolean[][] dp = new boolean[N][M];          // Initialize dp[0][0] as True if A[0] == B[0]         dp[0][0] = A.charAt(0) == B.charAt(0);          // Initialize dp[0][j] for j > 0         for (int j = 1; j < M; j++) {             dp[0][j] = A.charAt(0) == B.charAt(j) && !contains(arr, j) && dp[0][j - 1];         }          // Initialize dp[i][0] for i > 0         for (int i = 1; i < N; i++) {             dp[i][0] = A.charAt(i) == B.charAt(0) && !contains(arr, i) && dp[i - 1][0];         }          // Fill the remaining cells of the dp table         for (int i = 1; i < N; i++) {             for (int j = 1; j < M; j++) {                 dp[i][j] = false;                  if (A.charAt(i) == B.charAt(j)) {                     dp[i][j] = dp[i][j] || dp[i - 1][j - 1];                 }                  if (i > 1 && j > 0 && A.charAt(i) == B.charAt(j - 1) &&                     A.charAt(i - 1) == B.charAt(j) && !contains(arr, j) &&                      !contains(arr, j - 1)) {                     dp[i][j] = dp[i][j] || dp[i - 2][j - 2];                 }                  if (j > 1) {                     dp[i][j] = dp[i][j] || (A.charAt(i) == B.charAt(j - 2) &&                                              A.charAt(i) == B.charAt(j - 1) &&                                              !contains(arr, j - 2) &&                                              !contains(arr, j - 1) && dp[i][j - 2]);                 }                  if (i > 1) {                     dp[i][j] = dp[i][j] || (A.charAt(i) == B.charAt(j) &&                                             A.charAt(i - 1) == B.charAt(j - 1) &&                                              !contains(arr, j) && !contains(arr, j - 1) &&                                              dp[i - 2][j - 1]);                 }             }         }          return dp[N - 1][M - 1];     }      // Helper method to check if an array contains a given value     static boolean contains(int[] arr, int value) {         for (int num : arr) {             if (num == value) {                 return true;             }         }         return false;     }      public static void main(String[] args) {         String A = "abcabka";         String B = "acbakba";         int[] arr = {0, 3, 6};         if (isPossible(A, B, arr)) {             System.out.println("Yes");         } else {             System.out.println("No");         }     } } 
Python3
def isPossible(A, B, arr):     N = len(A)     M = len(B)      # Create a 2D boolean array to store if it is possible to     # transform A[0...i] to B[0...j] with the given constraints     dp = [[False] * M for _ in range(N)]      # Initialize dp[0][0] as True if A[0] == B[0]     dp[0][0] = A[0] == B[0]      # Initialize dp[0][j] for j > 0     for j in range(1, M):         dp[0][j] = A[0] == B[j] and (not j in arr) and dp[0][j - 1]      # Initialize dp[i][0] for i > 0     for i in range(1, N):         dp[i][0] = A[i] == B[0] and (not i in arr) and dp[i - 1][0]      # Fill the remaining cells of the dp table     for i in range(1, N):         for j in range(1, M):             dp[i][j] = False              if A[i] == B[j]:                 dp[i][j] = dp[i][j] or dp[i - 1][j - 1]              if i > 1 and j > 0 and A[i] == B[j - 1] and A[i - 1] == B[j] and (not j in arr) and (not (j - 1) in arr):                 dp[i][j] = dp[i][j] or dp[i - 2][j - 2]              if j > 1:                 dp[i][j] = dp[i][j] or (A[i] == B[j - 2] and A[i] == B[j - 1] and (not (j - 2) in arr) and (not (j - 1) in arr) and dp[i][j - 2])              if i > 1:                 dp[i][j] = dp[i][j] or (A[i] == B[j] and A[i - 1] == B[j - 1] and (not j in arr) and (not (j - 1) in arr) and dp[i - 2][j - 1])      return dp[N - 1][M - 1]  # Example usage A = "abcabka" B = "acbakba" arr = [0, 3, 6]  if isPossible(A, B, arr):     print("Yes") else:     print("No") 
C#
using System; using System.Collections.Generic;  class Program {     static bool IsPossible(string A, string B, List<int> arr)     {         int N = A.Length;         int M = B.Length;         if (N != M)         {             return false;         }          // Create a 2D boolean array to store if it is possible to         // transform A[0...i] to B[0...j] with the given constraints         bool[,] dp = new bool[N, M];          // Initialize dp[0][0] as true if A[0] == B[0]         dp[0, 0] = (A[0] == B[0]);          // Initialize dp[0][j] for j > 0         for (int j = 1; j < M; j++)         {             dp[0, j] = (A[0] == B[j]);             dp[0, j] = dp[0, j] && !arr.Contains(j);             dp[0, j] = dp[0, j] && dp[0, j - 1];         }          // Initialize dp[i][0] for i > 0         for (int i = 1; i < N; i++)         {             dp[i, 0] = (A[i] == B[0]);             dp[i, 0] = dp[i, 0] && !arr.Contains(i);             dp[i, 0] = dp[i, 0] && dp[i - 1, 0];         }          // Fill the remaining cells of the dp table         for (int i = 1; i < N; i++)         {             for (int j = 1; j < M; j++)             {                 dp[i, j] = false;                  if (A[i] == B[j])                 {                     dp[i, j] = dp[i, j] || dp[i - 1, j - 1];                 }                  if (i > 1 && j > 0 && A[i] == B[j - 1] && A[i - 1] == B[j] && !arr.Contains(j - 1) && !arr.Contains(j))                 {                     dp[i, j] = dp[i, j] || dp[i - 2, j - 2];                 }                  if (j > 1)                 {                     dp[i, j] = dp[i, j] || (A[i] == B[j - 2] && A[i] == B[j - 1] && !arr.Contains(j - 2) && !arr.Contains(j - 1) && dp[i, j - 2]);                 }                  if (i > 1)                 {                     dp[i, j] = dp[i, j] || (A[i] == B[j] && A[i - 1] == B[j - 1] && !arr.Contains(j) && !arr.Contains(j - 1) && dp[i - 2, j - 1]);                 }             }         }          return dp[N - 1, M - 1];     }      static void Main()     {         string A = "abcabka";         string B = "acbakba";         List<int> arr = new List<int> { 0, 3, 6 };         if (IsPossible(A, B, arr))         {             Console.WriteLine("Yes");         }         else         {             Console.WriteLine("No");         }     } } 
JavaScript
function isPossible(A, B, arr) {     const N = A.length;     const M = B.length;      // Create a 2D boolean array to store if it is possible to     // transform A[0...i] to B[0...j] with the given constraints     const dp = new Array(N).fill(0).map(() => new Array(M).fill(false));      // Initialize dp[0][0] as true if A[0] == B[0]     dp[0][0] = A[0] === B[0];      // Initialize dp[0][j] for j > 0     for (let j = 1; j < M; j++) {         dp[0][j] = A[0] === B[j] && arr[0] !== j && dp[0][j - 1];     }      // Initialize dp[i][0] for i > 0     for (let i = 1; i < N; i++) {         dp[i][0] = A[i] === B[0] && arr[0] !== i && dp[i - 1][0];     }      // Fill the remaining cells of the dp table     for (let i = 1; i < N; i++) {         for (let j = 1; j < M; j++) {             dp[i][j] = false;              if (A[i] === B[j]) {                 dp[i][j] = dp[i][j] || dp[i - 1][j - 1];             }              if (i > 1 && j > 0 && A[i] === B[j - 1] && A[i - 1] === B[j] && arr[j - 1] !== j && arr[j] !== j - 1) {                 dp[i][j] = dp[i][j] || dp[i - 2][j - 2];             }              if (j > 1) {                 dp[i][j] = dp[i][j] || (A[i] === B[j - 2] && A[i] === B[j - 1] && arr[j - 2] !== j && arr[j - 1] !== j && dp[i][j - 2]);             }              if (i > 1) {                 dp[i][j] = dp[i][j] || (A[i] === B[j] && A[i - 1] === B[j - 1] && arr[j] !== j && arr[j - 1] !== j - 1 && dp[i - 2][j - 1]);             }         }     }      return dp[N - 1][M - 1]; }  // Example usage const A = "abcabka"; const B = "acbakba"; const arr = [0, 3, 6];  if (isPossible(A, B, arr)) {     console.log("Yes"); } else {     console.log("No"); } 

Output

Yes

Time complexity: O(NM), where N is the length of string A and M is the length of string B.

Auxiliary Space: O(NM), to store the 2D boolean dp array.


Next Article
Check if given strings can be made same by swapping two characters of same or different strings

S

shubhampokhriyal2018
Improve
Article Tags :
  • Strings
  • Greedy
  • Hash
  • Technical Scripter
  • DSA
  • Technical Scripter 2020
  • cpp-map
  • frequency-counting
Practice Tags :
  • Greedy
  • Hash
  • Strings

Similar Reads

  • Check if two binary strings can be made equal by swapping pairs of unequal characters
    Given two binary strings S1 and S2 of length N (1 ? N ? 105), the task is to check if it is possible to convert the string S1 to S2 by performing the following operations any number of times: Select any two indices i and j (1 ? i < j ? N) such that S1[i] is ‘0’ and S1[j] is ‘1’.Swap S1[i] with S1
    12 min read
  • Check if two strings can be made equal by swapping one character among each other
    Given two strings A and B of length N, the task is to check whether the two strings can be made equal by swapping any character of A with any other character of B only once.Examples: Input: A = "SEEKSFORGEEKS", B = "GEEKSFORGEEKG" Output: Yes "SEEKSFORGEEKS" and "GEEKSFORGEEKG" After removing the el
    10 min read
  • Check if a string can be made equal to another string by swapping or replacement of characters
    Given two strings S1 and S2, the task is to check if string S1 can be made equal to string S2 by swapping any pair of characters replacing any character in the string S1. If it is possible to make the string S1 equal to S2, then print "Yes". Otherwise, print "No". Examples: Input: S1 = “abc”, S2 = “
    8 min read
  • Check if String T can be made Substring of S by replacing given characters
    Given two strings S and T and a 2D array replace[][], where replace[i] = {oldChar, newChar} represents that the character oldChar of T is replaced with newChar. The task is to find if it is possible to make string T a substring of S by replacing characters according to the replace array. Note: Each
    9 min read
  • Check if given strings can be made same by swapping two characters of same or different strings
    Given an array of equal-length strings, arr[] of size N, the task is to check if all the strings can be made equal by repeatedly swapping any pair of characters of same or different strings from the given array. If found to be true, then print "YES". Otherwise, print "NO". Examples: Input: arr[] = {
    11 min read
  • Check whether two strings can be made equal by copying their characters with the adjacent ones
    Given two strings str1 and str2, the task is to check whether both of the string can be made equal by copying any character of the string with its adjacent character. Note that this operation can be performed any number of times.Examples: Input: str1 = "abc", str2 = "def" Output: No As all the chara
    5 min read
  • Check if a string can be converted to another by swapping of adjacent characters of given type
    Given two strings str1 and str2 of size N consisting of only three characters A, B, and C, the task is to check whether the string str1 can be changed to str2 using the below operations: Replacing one occurrence of “BC” with “CB” i.e swap adjacent ‘B’ and ‘C’.Replacing one occurrence of “CA” with “A
    7 min read
  • Check if a two character string can be made using given words
    Given a string of two characters and n distinct words of two characters. The task is to find if it is possible to arrange given words in such a way that the concatenated string has the given two character string as a substring. We can append a word multiple times. Examples: Input : str = "ya" words[
    6 min read
  • Check if two binary strings can be made equal by swapping 1s occurring before 0s
    Given two binary strings str1 and str2 having same length, the task is to find if it is possible to make the two binary strings str1 and str2 equal by swapping all 1s occurring at indices less than that of 0s index in the binary string str1. Examples: Input: str1 = "0110", str2 = "0011" Output: Poss
    15+ min read
  • Minimum flips or swapping of adjacent characters required to make a string equal to another
    Given two binary strings A and B of length N, the task is to convert the string A to B by either flipping any character of A or swapping adjacent characters of A minimum number of times. If it is not possible to make both the strings equal, print -1. Examples: Input: A = "10010010", B = "00001000" O
    6 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences