Longest Common Subsequence (LCS) by repeatedly swapping characters of a string with characters of another string Last Updated : 27 May, 2021 Summarize Comments Improve Suggest changes Share Like Article Like Report Given two strings A and B of lengths N and M respectively, the task is to find the length of the longest common subsequence that can be two strings if any character from string A can be swapped with any other character from B any number of times. Examples: Input: A = "abdeff", B = "abbet"Output: 4Explanation: Swapping A[5] and B[4] modifies A to "abdeft" and B to "abbef". LCS of the given strings is "abef". Therefore, length is 4. Input: A = "abcd", B = "ab"Output: 2Explanation: LCS of the given strings is "ab". Therefore, length is 2. Approach: The idea is based on the observation that if any character from string A can be swapped with any other character from string B, then it is also possible to swap characters within string A and also within string B. Proof: If characters A[i] and A[j] are required to be swapped, then take a temporary element at any index k in string B. Follow the steps below to solve the problem: Swap A[i] with B[k].Swap B[k] with A[j].Swap B[k] with A[i]. In this way, the characters within a string can be swapped. Now, the elements can be arranged in any order. Therefore, the idea is to find the frequencies of all the characters present in both the strings and divide them equally. Follow the steps below to solve the problem: Initialize an array, say freq, of size 26, to store the frequency of each character present in the strings.Traverse the strings A and B and update the frequency of each character in the array freq[].Initialize a variable, say cnt, to store the required length.Traverse the array freq[] and increase the value of cnt by freq[i] / 2.Store the minimum of cnt, N, and M in a variable, say ans.Print the value of ans as the result. Below is the implementation of the above approach: C++ // C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the length of LCS // possible by swapping any character // of a string with that of another string void lcsBySwapping(string A, string B) { // Store the size of the strings int N = A.size(); int M = B.size(); // Stores frequency of characters int freq[26]; memset(freq, 0, sizeof(freq)); // Iterate over characters of the string A for (int i = 0; i < A.size(); i++) { // Update frequency of character A[i] freq[A[i] - 'a'] += 1; } // Iterate over characters of the string B for (int i = 0; i < B.size(); i++) { // Update frequency of character B[i] freq[B[i] - 'a'] += 1; } // Store the count of all pairs // of similar characters int cnt = 0; // Traverse the array freq[] for (int i = 0; i < 26; i++) { // Update cnt cnt += freq[i] / 2; } // Print the minimum of cnt, N and M cout << min(cnt, min(N, M)); } // Driver Code int main() { // Given strings string A = "abdeff"; string B = "abbet"; lcsBySwapping(A, B); return 0; } Java // Java program for the above approach import java.io.*; import java.lang.*; import java.util.*; class GFG{ // Function to find the length of LCS // possible by swapping any character // of a string with that of another string static void lcsBySwapping(String A, String B) { // Store the size of the strings int N = A.length(); int M = B.length(); // Stores frequency of characters int freq[] = new int[26]; // Iterate over characters of the string A for(int i = 0; i < N; i++) { // Update frequency of character A[i] freq[A.charAt(i) - 'a'] += 1; } // Iterate over characters of the string B for(int i = 0; i < M; i++) { // Update frequency of character B[i] freq[B.charAt(i) - 'a'] += 1; } // Store the count of all pairs // of similar characters int cnt = 0; // Traverse the array freq[] for(int i = 0; i < 26; i++) { // Update cnt cnt += freq[i] / 2; } // Print the minimum of cnt, N and M System.out.println(Math.min(cnt, Math.min(N, M))); } // Driver Code public static void main(String[] args) { // Given strings String A = "abdeff"; String B = "abbet"; lcsBySwapping(A, B); } } // This code is contributed by Kingash Python3 # Python3 program for the above approach # Function to find the length of LCS # possible by swapping any character # of a with that of another string def lcsBySwapping(A, B): # Store the size of the strings N = len(A) M = len(B) # Stores frequency of characters freq = [0] * 26 # Iterate over characters of the A for i in range(len(A)): # Update frequency of character A[i] freq[ord(A[i]) - ord('a')] += 1 # Iterate over characters of the B for i in range(len(B)): # Update frequency of character B[i] freq[ord(B[i]) - ord('a')] += 1 # Store the count of all pairs # of similar characters cnt = 0 # Traverse the array freq[] for i in range(26): # Update cnt cnt += freq[i] // 2 # Print the minimum of cnt, N and M print (min(cnt, min(N, M))) # Driver Code if __name__ == '__main__': # Given strings A = "abdeff" B = "abbet" lcsBySwapping(A, B) # This code is contributed by mohit kumar 29 C# // C# program for the above approach using System; class GFG{ // Function to find the length of LCS // possible by swapping any character // of a string with that of another string static void lcsBySwapping(string A, string B) { // Store the size of the strings int N = A.Length; int M = B.Length; // Stores frequency of characters int[] freq = new int[26]; // Iterate over characters of the string A for(int i = 0; i < N; i++) { // Update frequency of character A[i] freq[A[i] - 'a'] += 1; } // Iterate over characters of the string B for(int i = 0; i < M; i++) { // Update frequency of character B[i] freq[B[i] - 'a'] += 1; } // Store the count of all pairs // of similar characters int cnt = 0; // Traverse the array freq[] for(int i = 0; i < 26; i++) { // Update cnt cnt += freq[i] / 2; } // Print the minimum of cnt, N and M Console.WriteLine(Math.Min(cnt, Math.Min(N, M))); } // Driver Code public static void Main(string[] args) { // Given strings string A = "abdeff"; string B = "abbet"; lcsBySwapping(A, B); } } // This code is contributed by ukasp JavaScript <script> //Javascript program for the above approach // Function to find the length of LCS // possible by swapping any character // of a string with that of another string function lcsBySwapping(A, B) { // Store the size of the strings var N = A.length; var M = B.length; // Stores frequency of characters var freq = new Array(26); freq.fill(0); // Iterate over characters of the string A for (var i = 0; i < A.length; i++) { // Update frequency of character A[i] freq[A[i].charCodeAt(0) - 'a'.charCodeAt(0)] += 1; } // Iterate over characters of the string B for (var i = 0; i < B.length; i++) { // Update frequency of character B[i] freq[B[i].charCodeAt(0) - 'a'.charCodeAt(0)] += 1; } // Store the count of all pairs // of similar characters var cnt = 0; // Traverse the array freq[] for (var i = 0; i < 26; i++) { // Update cnt cnt += parseInt(freq[i] / 2); } // Print the minimum of cnt, N and M document.write( Math.min(cnt, Math.min(N, M))); } var A = "abdeff"; var B = "abbet"; lcsBySwapping(A, B); //This code is contributed by SoumikMondal </script> Output: 4 Time Complexity: O(N + M)Auxiliary Space: O(1) Comment More infoAdvertise with us Next Article Longest Common Subsequence with at most k changes allowed A AmanGupta65 Follow Improve Article Tags : Misc Strings Hash DSA subsequence LCS frequency-counting +3 More Practice Tags : HashLCSMiscStrings Similar Reads Longest Common Subsequence (LCS) Given two strings, s1 and s2, the task is to find the length of the Longest Common Subsequence. If there is no common subsequence, return 0. A subsequence is a string generated from the original string by deleting 0 or more characters, without changing the relative order of the remaining characters. 15+ min read Printing Longest Common Subsequence Given two sequences, print the longest subsequence present in both of them. Examples: LCS for input Sequences âABCDGHâ and âAEDFHRâ is âADHâ of length 3. LCS for input Sequences âAGGTABâ and âGXTXAYBâ is âGTABâ of length 4.We have discussed Longest Common Subsequence (LCS) problem in a previous post 15+ min read Longest Common Subsequence | DP using Memoization Given two strings s1 and s2, the task is to find the length of the longest common subsequence present in both of them. Examples: Input: s1 = âABCDGHâ, s2 = âAEDFHRâ Output: 3 LCS for input Sequences âAGGTABâ and âGXTXAYBâ is âGTABâ of length 4. Input: s1 = âstriverâ, s2 = ârajâ Output: 1 The naive s 13 min read Longest Common Increasing Subsequence (LCS + LIS) Given two arrays, a[] and b[], find the length of the longest common increasing subsequence(LCIS). LCIS refers to a subsequence that is present in both arrays and strictly increases.Prerequisites: LCS, LIS.Examples:Input: a[] = [3, 4, 9, 1], b[] = [5, 3, 8, 9, 10, 2, 1]Output: 2Explanation: The long 15+ min read LCS (Longest Common Subsequence) of three strings Given three strings s1, s2 and s3. Your task is to find the longest common sub-sequence in all three given sequences.Note: This problem is simply an extension of LCS.Examples: Input: s1 = "geeks" , s2 = "geeksfor", s3 = "geeksforgeeks"Output : 5Explanation: Longest common subsequence is "geeks" i.e. 15+ min read C++ Program for Longest Common Subsequence LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So 3 min read Java Program for Longest Common Subsequence LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So 4 min read Python Program for Longest Common Subsequence LCS Problem Statement: Given two sequences, find the length of longest subsequence present in both of them. A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous. For example, "abc", "abg", "bdf", "aeg", '"acefg", .. etc are subsequences of "abcdefg". So 3 min read Problems on LCSEdit distance and LCS (Longest Common Subsequence)In standard Edit Distance where we are allowed 3 operations, insert, delete, and replace. Consider a variation of edit distance where we are allowed only two operations insert and delete, find edit distance in this variation. Examples: Input : str1 = "cat", st2 = "cut"Output : 2We are allowed to ins 6 min read Length of longest common subsequence containing vowelsGiven two strings X and Y of length m and n respectively. The problem is to find the length of the longest common subsequence of strings X and Y which contains all vowel characters.Examples: Input : X = "aieef" Y = "klaief"Output : aieInput : X = "geeksforgeeks" Y = "feroeeks"Output : eoeeSource:Pay 14 min read Longest Common Subsequence (LCS) by repeatedly swapping characters of a string with characters of another stringGiven two strings A and B of lengths N and M respectively, the task is to find the length of the longest common subsequence that can be two strings if any character from string A can be swapped with any other character from B any number of times. Examples: Input: A = "abdeff", B = "abbet"Output: 4Ex 7 min read Longest Common Subsequence with at most k changes allowedGiven two sequence P and Q of numbers. The task is to find Longest Common Subsequence of two sequences if we are allowed to change at most k element in first sequence to any value. Examples: Input : P = { 8, 3 } Q = { 1, 3 } K = 1 Output : 2 If we change first element of first sequence from 8 to 1, 8 min read Minimum cost to make Longest Common Subsequence of length kGiven two string X, Y and an integer k. Now the task is to convert string X with the minimum cost such that the Longest Common Subsequence of X and Y after conversion is of length k. The cost of conversion is calculated as XOR of old character value and new character value. The character value of 'a 14 min read Longest Common SubstringGiven two strings 's1' and 's2', find the length of the longest common substring. Example: Input: s1 = "GeeksforGeeks", s2 = "GeeksQuiz" Output : 5 Explanation:The longest common substring is "Geeks" and is of length 5.Input: s1 = "abcdxyz", s2 = "xyzabcd" Output : 4Explanation:The longest common su 15+ min read Longest Common Subsequence of two arrays out of which one array consists of distinct elements onlyGiven two arrays firstArr[], consisting of distinct elements only, and secondArr[], the task is to find the length of LCS between these 2 arrays. Examples: Input: firstArr[] = {3, 5, 1, 8}, secondArr[] = {3, 3, 5, 3, 8}Output: 3.Explanation: LCS between these two arrays is {3, 5, 8}. Input : firstAr 7 min read Longest Repeating SubsequenceGiven a string s, the task is to find the length of the longest repeating subsequence, such that the two subsequences don't have the same string character at the same position, i.e. any ith character in the two subsequences shouldn't have the same index in the original string. Examples:Input: s= "ab 15+ min read Longest Common Anagram SubsequenceGiven two strings str1 and str2 of length n1 and n2 respectively. The problem is to find the length of the longest subsequence which is present in both the strings in the form of anagrams. Note: The strings contain only lowercase letters. Examples: Input : str1 = "abdacp", str2 = "ckamb" Output : 3 7 min read Length of Longest Common Subsequence with given sum KGiven two arrays a[] and b[] and an integer K, the task is to find the length of the longest common subsequence such that sum of elements is equal to K. Examples: Input: a[] = { 9, 11, 2, 1, 6, 2, 7}, b[] = {1, 2, 6, 9, 2, 3, 11, 7}, K = 18Output: 3Explanation: Subsequence { 11, 7 } and { 9, 2, 7 } 15+ min read Longest Common Subsequence with no repeating characterGiven two strings s1 and s2, the task is to find the length of the longest common subsequence with no repeating character. Examples: Input: s1= "aabbcc", s2= "aabc"Output: 3Explanation: "aabc" is longest common subsequence but it has two repeating character 'a'.So the required longest common subsequ 10 min read Find the Longest Common Subsequence (LCS) in given K permutationsGiven K permutations of numbers from 1 to N in a 2D array arr[][]. The task is to find the longest common subsequence of these K permutations. Examples: Input: N = 4, K = 3arr[][] = {{1, 4, 2, 3}, {4, 1, 2, 3}, {1, 2, 4, 3}}Output: 3Explanation: Longest common subsequence is {1, 2, 3} which has leng 10 min read Find length of longest subsequence of one string which is substring of another stringGiven two strings X and Y. The task is to find the length of the longest subsequence of string X which is a substring in sequence Y.Examples: Input : X = "ABCD", Y = "BACDBDCD"Output : 3Explanation: "ACD" is longest subsequence of X which is substring of Y.Input : X = "A", Y = "A"Output : 1Perquisit 15+ min read Length of longest common prime subsequence from two given arraysGiven two arrays arr1[] and arr2[] of length N and M respectively, the task is to find the length of the longest common prime subsequence that can be obtained from the two given arrays. Examples: Input: arr1[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}, arr2[] = {2, 5, 6, 3, 7, 9, 8} Output: 4 Explanation: The l 11 min read A Space Optimized Solution of LCSGiven two strings, s1 and s2, the task is to find the length of the Longest Common Subsequence. If there is no common subsequence, return 0.Examples:Input: s1 = âABCDGHâ, s2 = âAEDFHRâOutput: 3Explanation: The longest subsequence present in both strings is "ADH".Input: s1 = âAGGTABâ, s2 = âGXTXAYBâO 13 min read Longest common subarray in the given two arraysGiven two arrays A[] and B[] of N and M integers respectively, the task is to find the maximum length of an equal subarray or the longest common subarray between the two given array. Examples: Input: A[] = {1, 2, 8, 2, 1}, B[] = {8, 2, 1, 4, 7} Output: 3 Explanation: The subarray that is common to b 15+ min read Number of ways to insert a character to increase the LCS by oneGiven two strings A and B. The task is to count the number of ways to insert a character in string A to increase the length of the Longest Common Subsequence between string A and string B by 1. Examples: Input : A = "aa", B = "baaa" Output : 4 The longest common subsequence shared by string A and st 11 min read Longest common subsequence with permutations allowedGiven two strings in lowercase, find the longest string whose permutations are subsequences of given two strings. The output longest string must be sorted. Examples: Input : str1 = "pink", str2 = "kite" Output : "ik" The string "ik" is the longest sorted string whose one permutation "ik" is subseque 7 min read Longest subsequence such that adjacent elements have at least one common digitGiven an array arr[], the task is to find the length of the longest sub-sequence such that adjacent elements of the subsequence have at least one digit in common.Examples: Input: arr[] = [1, 12, 44, 29, 33, 96, 89] Output: 5 Explanation: The longest sub-sequence is [1 12 29 96 89]Input: arr[] = [12, 15+ min read Longest subsequence with different adjacent charactersGiven string str. The task is to find the longest subsequence of str such that all the characters adjacent to each other in the subsequence are different. Examples:Â Â Input: str = "ababa"Â Output: 5Â Explanation:Â "ababa" is the subsequence satisfying the condition Input: str = "xxxxy"Â Output: 2Â Explan 14 min read Longest subsequence such that difference between adjacents is oneGiven an array arr[] of size n, the task is to find the longest subsequence such that the absolute difference between adjacent elements is 1.Examples: Input: arr[] = [10, 9, 4, 5, 4, 8, 6]Output: 3Explanation: The three possible subsequences of length 3 are [10, 9, 8], [4, 5, 4], and [4, 5, 6], wher 15+ min read Longest Uncommon SubsequenceGiven two strings, find the length of longest uncommon subsequence of the two strings. The longest uncommon subsequence is defined as the longest subsequence of one of these strings which is not a subsequence of other strings. Examples: Input : "abcd", "abc"Output : 4The longest subsequence is 4 bec 12 min read LCS formed by consecutive segments of at least length KGiven two strings s1, s2 and K, find the length of the longest subsequence formed by consecutive segments of at least length K. Examples: Input : s1 = aggayxysdfa s2 = aggajxaaasdfa k = 4 Output : 8 Explanation: aggasdfa is the longest subsequence that can be formed by taking consecutive segments, m 9 min read Longest Increasing Subsequence using Longest Common Subsequence AlgorithmGiven an array arr[] of N integers, the task is to find and print the Longest Increasing Subsequence.Examples: Input: arr[] = {12, 34, 1, 5, 40, 80} Output: 4 {12, 34, 40, 80} and {1, 5, 40, 80} are the longest increasing subsequences.Input: arr[] = {10, 22, 9, 33, 21, 50, 41, 60, 80} Output: 6 Prer 12 min read Like