Skip to main content

Print all longest common subsequence

Here given code implementation process.

// C Program 
// Print all longest common subsequence 
#include <stdio.h>
#include <string.h>

// Returns the max value of given two numbers
int max_value(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}
// Returns the length of common substring
int lcs_length(const char *s1 , const char *s2, int n1, int n2, int i, int j)
{
	if (i == n1 || j == n2)
	{
		// When string length exceeds
		return 0;
	}
	else if (s1[i] == s2[j])
	{
		// When similar characters meet
		return 1 + lcs_length(s1, s2, n1, n2, i + 1, j + 1);
	}
	else
	{
		// Through recursively find similar characters
		return max_value(lcs_length(s1, s2, n1, n2, i + 1, j), lcs_length(s1, s2, n1, n2, i, j + 1));
	}
}
// Display the result
void print_result(const char *s1, int visit[], int n)
{
	for (int i = 0; i < n; ++i)
	{
		if (visit[i] == 1)
		{
			printf("%c", s1[i]);
		}
	}
	printf("\n");
}
// Print the all common subsequence in longest length 
int find_lcs(const char *s1 , const char *s2, int visit[], int n1, int n2, int i, int j, int k, int length)
{
	if (i == n1 || j == n2)
	{
		// When string length exceeds
		return 0;
	}
	else if (s1[i] == s2[j])
	{
		// When similar characters meet
		visit[i] = 1;
		if (k + 1 == length)
		{
			print_result(s1, visit, n1);
			visit[i] = 0;
			return 1;
		}
		else
		{
			find_lcs(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
		}
		visit[i] = 0;
	}
	else
	{
		// Through recursively find similar characters
		if (find_lcs(s1, s2, visit, n1, n2, i + 1, j, k, length) || find_lcs(s1, s2, visit, n1, n2, i, j + 1, k, length))
		{
			return 1;
		}
	}
	return 0;
}
// Handles the request of display longest common subsequence
void lcs(const char *s1 , const char *s2)
{
	// Get the size of string
	int n1 = strlen(s1);
	int n2 = strlen(s2);
	// First find the length of LCS
	int length = lcs_length(s1, s2, n1, n2, 0, 0);
	if (length > 0)
	{
		int visit[n1];
		for (int i = 0; i < n1; ++i)
		{
			visit[i] = 0;
		}
		// Print all longest common subsequence of given two strings
		find_lcs(s1, s2, visit, n1, n2, 0, 0, 0, length);
	}
}
int main(int argc, char
	const *argv[])
{
	// Given input strings
	const char *s1 = "XYZXYZXXZ";
	const char *s2 = "XZYXZYX";
	lcs(s1, s2);
	return 0;
}

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
/*
  Java Program for
  Print all longest common subsequence 
*/
public class LongestSubsequence
{
	// Returns the max value of given two numbers
	public int maxValue(int a, int b)
	{
		if (a > b)
		{
			return a;
		}
		else
		{
			return b;
		}
	}
	// Returns the length of common substring
	public int lcsLength(String s1, String s2, int n1, int n2, int i, int j)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1.charAt(i) == s2.charAt(j))
		{
			// When similar characters meet
			return 1 + lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return maxValue(lcsLength(s1, s2, n1, n2, i + 1, j), lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	public void printResult(String s, boolean[] visit, int n)
	{
		for (int i = 0; i < n; ++i)
		{
			if (visit[i] == true)
			{
				System.out.print(s.charAt(i));
			}
		}
		System.out.print("\n");
	}
	// Print the all common subsequence in longest length 
	public boolean findLCS(String s1, String s2, boolean[] visit, int n1, int n2, int i, int j, int k, int length)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1.charAt(i) == s2.charAt(j))
		{
			// When similar characters meet
			visit[i] = true;
			if (k + 1 == length)
			{
				printResult(s1, visit, n1);
				visit[i] = false;
				return true;
			}
			else
			{
				findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit[i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if (findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) || findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	public void lcs(String s1, String s2)
	{
		// Get the size of string
		int n1 = s1.length();
		int n2 = s2.length();
		// First find the length of LCS
		int length = lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			boolean[] visit = new boolean[n1];
			for (int i = 0; i < length; ++i)
			{
				visit[i] = false;
			}
			// Print all longest common subsequence of given two strings
			findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length);
		}
	}
	public static void main(String[] args)
	{
		LongestSubsequence task = new LongestSubsequence();
		String s1 = "XYZXYZXXZ";
		String s2 = "XZYXZYX";
		task.lcs(s1, s2);
	}
}

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
// Include header file
#include <iostream>
#include<string.h>
using namespace std;
/*
  C++ Program for
  Print all longest common subsequence 
*/
class LongestSubsequence
{
	public:
		// Returns the max value of given two numbers
		int maxValue(int a, int b)
		{
			if (a > b)
			{
				return a;
			}
			else
			{
				return b;
			}
		}
	// Returns the length of common substring
	int lcsLength(string s1, string s2, int n1, int n2, int i, int j)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			return 1 + this->lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return this->maxValue(this->lcsLength(s1, s2, n1, n2, i + 1, j), this->lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	void printResult(string s, bool visit[], int n)
	{
		for (int i = 0; i < n; ++i)
		{
			if (visit[i] == true)
			{
				cout << s[i];
			}
		}
		cout << "\n";
	}
	// Print the all common subsequence in longest length
	bool findLCS(string s1, string s2, bool visit[], int n1, int n2, int i, int j, int k, int length)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			visit[i] = true;
			if (k + 1 == length)
			{
				this->printResult(s1, visit, n1);
				visit[i] = false;
				return true;
			}
			else
			{
				this->findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit[i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if (this->findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) || this->findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	void lcs(string s1, string s2)
	{
		// Get the size of string
		int n1 = s1.size();
		int n2 = s2.size();
		// First find the length of LCS
		int length = this->lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			bool visit[n1];
			for (int i = 0; i < length; ++i)
			{
				visit[i] = false;
			}
			// Print all longest common subsequence of given two strings
			this->findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length);
		}
	}
};
int main()
{
	LongestSubsequence task = LongestSubsequence();
	string s1 = "XYZXYZXXZ";
	string s2 = "XZYXZYX";
	task.lcs(s1, s2);
	return 0;
}

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
// Include namespace system
using System;
/*
  C# Program for
  Print all longest common subsequence 
*/
public class LongestSubsequence
{
	// Returns the max value of given two numbers
	public int maxValue(int a, int b)
	{
		if (a > b)
		{
			return a;
		}
		else
		{
			return b;
		}
	}
	// Returns the length of common substring
	public int lcsLength(String s1, String s2, int n1, int n2, int i, int j)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			return 1 + lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return maxValue(lcsLength(s1, s2, n1, n2, i + 1, j), lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	public void printResult(String s, Boolean[] visit, int n)
	{
		for (int i = 0; i < n; ++i)
		{
			if (visit[i] == true)
			{
				Console.Write(s[i]);
			}
		}
		Console.Write("\n");
	}
	// Print the all common subsequence in longest length
	public Boolean findLCS(String s1, String s2, Boolean[] visit, int n1, int n2, int i, int j, int k, int length)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			visit[i] = true;
			if (k + 1 == length)
			{
				printResult(s1, visit, n1);
				visit[i] = false;
				return true;
			}
			else
			{
				findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit[i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if (findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) || findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	public void lcs(String s1, String s2)
	{
		// Get the size of string
		int n1 = s1.Length;
		int n2 = s2.Length;
		// First find the length of LCS
		int length = lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			Boolean[] visit = new Boolean[n1];
			for (int i = 0; i < length; ++i)
			{
				visit[i] = false;
			}
			// Print all longest common subsequence of given two strings
			findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length);
		}
	}
	public static void Main(String[] args)
	{
		LongestSubsequence task = new LongestSubsequence();
		String s1 = "XYZXYZXXZ";
		String s2 = "XZYXZYX";
		task.lcs(s1, s2);
	}
}

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
/*
  Node Js Program for
  Print all longest common subsequence 
*/
class LongestSubsequence
{
	// Returns the max value of given two numbers
	maxValue(a, b)
	{
		if (a > b)
		{
			return a;
		}
		else
		{
			return b;
		}
	}
	// Returns the length of common substring
	lcsLength(s1, s2, n1, n2, i, j)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1.charAt(i) == s2.charAt(j))
		{
			// When similar characters meet
			return 1 + this.lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return this.maxValue(this.lcsLength(s1, s2, n1, n2, i + 1, j), this.lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	printResult(s, visit, n)
	{
		for (var i = 0; i < n; ++i)
		{
			if (visit[i] == true)
			{
				process.stdout.write(s.charAt(i));
			}
		}
		process.stdout.write("\n");
	}
	// Print the all common subsequence in longest length
	findLCS(s1, s2, visit, n1, n2, i, j, k, length)
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1.charAt(i) == s2.charAt(j))
		{
			// When similar characters meet
			visit[i] = true;
			if (k + 1 == length)
			{
				this.printResult(s1, visit, n1);
				visit[i] = false;
				return true;
			}
			else
			{
				this.findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit[i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if (this.findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) || this.findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	lcs(s1, s2)
	{
		// Get the size of string
		var n1 = s1.length;
		var n2 = s2.length;
		// First find the length of LCS
		var length = this.lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			var visit = Array(n1).fill(false);
			// Print all longest common subsequence of given two strings
			this.findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length);
		}
	}
}

function main()
{
	var task = new LongestSubsequence();
	var s1 = "XYZXYZXXZ";
	var s2 = "XZYXZYX";
	task.lcs(s1, s2);
}
main();

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
<?php
/*
  Php Program for
  Print all longest common subsequence 
*/
class LongestSubsequence
{
	// Returns the max value of given two numbers
	public	function maxValue($a, $b)
	{
		if ($a > $b)
		{
			return $a;
		}
		else
		{
			return $b;
		}
	}
	// Returns the length of common substring
	public	function lcsLength($s1, $s2, $n1, $n2, $i, $j)
	{
		if ($i == $n1 || $j == $n2)
		{
			// When string length exceeds
			return 0;
		}
		else if ($s1[$i] == $s2[$j])
		{
			// When similar characters meet
			return 1 + $this->lcsLength($s1, $s2, $n1, $n2, $i + 1, $j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return $this->maxValue($this->lcsLength($s1, $s2, $n1, $n2, $i + 1, $j),
                                   $this->lcsLength($s1, $s2, $n1, $n2, $i, $j + 1));
		}
	}
	// Display the result
	public	function printResult($s, & $visit, $n)
	{
		for ($i = 0; $i < $n; ++$i)
		{
			if ($visit[$i] == true)
			{
				echo $s[$i];
			}
		}
		echo "\n";
	}
	// Print the all common subsequence in longest length
	public	function findLCS($s1, $s2, & $visit, $n1, $n2, $i, $j, $k, $length)
	{
		if ($i == $n1 || $j == $n2)
		{
			// When string length exceeds
			return false;
		}
		else if ($s1[$i] == $s2[$j])
		{
			// When similar characters meet
			$visit[$i] = true;
			if ($k + 1 == $length)
			{
				$this->printResult($s1, $visit, $n1);
				$visit[$i] = false;
				return true;
			}
			else
			{
				$this->findLCS($s1, $s2, $visit, $n1, $n2, $i + 1, $j + 1, $k + 1, $length);
			}
			$visit[$i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if ($this->findLCS($s1, $s2, $visit, $n1, $n2, $i + 1, $j, $k, $length) 
                || $this->findLCS($s1, $s2, $visit, $n1, $n2, $i, $j + 1, $k, $length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	public	function lcs($s1, $s2)
	{
		// Get the size of string
		$n1 = strlen($s1);
		$n2 = strlen($s2);
		// First find the length of LCS
		$length = $this->lcsLength($s1, $s2, $n1, $n2, 0, 0);
		if ($length > 0)
		{
			$visit = array_fill(0, $n1, false);
			// Print all longest common subsequence of given two strings
			$this->findLCS($s1, $s2, $visit, $n1, $n2, 0, 0, 0, $length);
		}
	}
}

function main()
{
	$task = new LongestSubsequence();
	$s1 = "XYZXYZXXZ";
	$s2 = "XZYXZYX";
	$task->lcs($s1, $s2);
}
main();

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
#   Python 3 Program for
#   Print all longest common subsequence 

class LongestSubsequence :
	#  Returns the max value of given two numbers
	def maxValue(self, a, b) :
		if (a > b) :
			return a
		else :
			return b
		
	
	#  Returns the length of common substring
	def lcsLength(self, s1, s2, n1, n2, i, j) :
		if (i == n1 or j == n2) :
			#  When string length exceeds
			return 0
		
		elif(s1[i] == s2[j]) :
			#  When similar characters meet
			return 1 + self.lcsLength(s1, s2, n1, n2, i + 1, j + 1)
		else :
			#  Through recursively find similar characters
			return self.maxValue(self.lcsLength(s1, s2, n1, n2, i + 1, j), self.lcsLength(s1, s2, n1, n2, i, j + 1))
		
	
	#  Display the result
	def printResult(self, s, visit, n) :
		i = 0
		while (i < n) :
			if (visit[i] == True) :
				print(s[i], end = "")
			
			i += 1
		
		print(end = "\n")
	
	#  Print the all common subsequence in longest length
	def findLCS(self, s1, s2, visit, n1, n2, i, j, k, length) :
		if (i == n1 or j == n2) :
			#  When string length exceeds
			return False
		
		elif(s1[i] == s2[j]) :
			#  When similar characters meet
			visit[i] = True
			if (k + 1 == length) :
				self.printResult(s1, visit, n1)
				visit[i] = False
				return True
			else :
				self.findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length)
			
			visit[i] = False
		else :
			#  Through recursively find similar characters
			if (self.findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) or self.findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length)) :
				return True
			
		
		return False
	
	#  Handles the request of display longest common subsequence
	def lcs(self, s1, s2) :
		#  Get the size of string
		n1 = len(s1)
		n2 = len(s2)
		#  First find the length of LCS
		length = self.lcsLength(s1, s2, n1, n2, 0, 0)
		if (length > 0) :
			visit = [False] * (n1)
			#  Print all longest common subsequence of given two strings
			self.findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length)
		
	

def main() :
	task = LongestSubsequence()
	s1 = "XYZXYZXXZ"
	s2 = "XZYXZYX"
	task.lcs(s1, s2)

if __name__ == "__main__": main()

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
#   Ruby Program for
#   Print all longest common subsequence 

class LongestSubsequence 
	#  Returns the max value of given two numbers
	def maxValue(a, b) 
		if (a > b) 
			return a
		else 
			return b
		end
	end

	#  Returns the length of common substring
	def lcsLength(s1, s2, n1, n2, i, j) 
		if (i == n1 || j == n2) 
			#  When string length exceeds
			return 0
		elsif(s1[i] == s2[j]) 
			#  When similar characters meet
			return 1 + self.lcsLength(s1, s2, n1, n2, i + 1, j + 1)
		else 
			#  Through recursively find similar characters
			return self.maxValue(self.lcsLength(s1, s2, n1, n2, i + 1, j), self.lcsLength(s1, s2, n1, n2, i, j + 1))
		end

	end

	#  Display the result
	def printResult(s, visit, n) 
		i = 0
		while (i < n) 
			if (visit[i] == true) 
				print(s[i])
			end

			i += 1
		end

		print("\n")
	end

	#  Print the all common subsequence in longest length
	def findLCS(s1, s2, visit, n1, n2, i, j, k, length) 
		if (i == n1 || j == n2) 
			#  When string length exceeds
			return false
		elsif(s1[i] == s2[j]) 
			#  When similar characters meet
			visit[i] = true
			if (k + 1 == length) 
				self.printResult(s1, visit, n1)
				visit[i] = false
				return true
			else 
				self.findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length)
			end

			visit[i] = false
		else 
			#  Through recursively find similar characters
			if (self.findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) || self.findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length)) 
				return true
			end

		end

		return false
	end

	#  Handles the request of display longest common subsequence
	def lcs(s1, s2) 
		#  Get the size of string
		n1 = s1.length()
		n2 = s2.length()
		#  First find the length of LCS
		length = self.lcsLength(s1, s2, n1, n2, 0, 0)
		if (length > 0) 
			visit = Array.new(n1) {false}
			#  Print all longest common subsequence of given two strings
			self.findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length)
		end

	end

end

def main() 
	task = LongestSubsequence.new()
	s1 = "XYZXYZXXZ"
	s2 = "XZYXZYX"
	task.lcs(s1, s2)
end

main()

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
/*
  Scala Program for
  Print all longest common subsequence 
*/
class LongestSubsequence
{
	// Returns the max value of given two numbers
	def maxValue(a: Int, b: Int): Int = {
		if (a > b)
		{
			return a;
		}
		else
		{
			return b;
		}
	}
	// Returns the length of common substring
	def lcsLength(s1: String, s2: String, n1: Int, n2: Int, i: Int, j: Int): Int = {
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1(i) == s2(j))
		{
			// When similar characters meet
			return 1 + this.lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return this.maxValue(this.lcsLength(s1, s2, n1, n2, i + 1, j), this.lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	def printResult(s: String, visit: Array[Boolean], n: Int): Unit = {
		var i: Int = 0;
		while (i < n)
		{
			if (visit(i) == true)
			{
				print(s(i));
			}
			i += 1;
		}
		print("\n");
	}
	// Print the all common subsequence in longest length
	def findLCS(s1: String, s2: String, visit: Array[Boolean], n1: Int, n2: Int, i: Int, j: Int, k: Int, length: Int): Boolean = {
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1(i) == s2(j))
		{
			// When similar characters meet
			visit(i) = true;
			if (k + 1 == length)
			{
				this.printResult(s1, visit, n1);
				visit(i) = false;
				return true;
			}
			else
			{
				this.findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit(i) = false;
		}
		else
		{
			// Through recursively find similar characters
			if (this.findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) || this.findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	def lcs(s1: String, s2: String): Unit = {
		// Get the size of string
		var n1: Int = s1.length();
		var n2: Int = s2.length();
		// First find the length of LCS
		var length: Int = this.lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			var visit: Array[Boolean] = Array.fill[Boolean](n1)(false);
			// Print all longest common subsequence of given two strings
			this.findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length);
		}
	}
}
object Main
{
	def main(args: Array[String]): Unit = {
		var task: LongestSubsequence = new LongestSubsequence();
		var s1: String = "XYZXYZXXZ";
		var s2: String = "XZYXZYX";
		task.lcs(s1, s2);
	}
}

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
/*
  Swift 4 Program for
  Print all longest common subsequence 
*/
class LongestSubsequence
{
	// Returns the max value of given two numbers
	func maxValue(_ a: Int, _ b: Int)->Int
	{
		if (a > b)
		{
			return a;
		}
		else
		{
			return b;
		}
	}
	// Returns the length of common substring
	func lcsLength(_ s1: [Character], _ s2: [Character], _ n1: Int, _ n2: Int, _ i: Int, _ j: Int)->Int
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			return 1 + self.lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return self.maxValue(self.lcsLength(s1, s2, n1, n2, i + 1, j),
                                 self.lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	func printResult(_ s: [Character], _ visit: [Bool], _ n: Int)
	{
		var i: Int = 0;
		while (i < n)
		{
			if (visit[i] == true)
			{
				print(s[i], terminator: "");
			}
			i += 1;
		}
		print(terminator: "\n");
	}
	// Print the all common subsequence in longest length
	func findLCS(_ s1: [Character], _ s2: [Character], _ visit: inout[Bool], _ n1: Int, _ n2: Int, _ i: Int, _ j: Int, _ k: Int, _ length: Int)->Bool
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			visit[i] = true;
			if (k + 1 == length)
			{
				self.printResult(s1, visit, n1);
				visit[i] = false;
				return true;
			}
			else
			{
				let _ = self.findLCS(s1, s2, &visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit[i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if (self.findLCS(s1, s2, &visit, n1, n2, i + 1, j, k, length) 
                || self.findLCS(s1, s2, &visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	func lcs(_ str1: String, _ str2: String)
	{
      	let s1 = Array(str1);
      	let s2 = Array(str2);
		// Get the size 
		let n1: Int = s1.count;
		let n2: Int = s2.count;
      
		// First find the length of LCS
		let length: Int = self.lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			var visit: [Bool] = Array(repeating: false, count: n1);
			// Print all longest common subsequence of given two strings
			let _ = self.findLCS(s1, s2, &visit, n1, n2, 0, 0, 0, length);
		}
	}
}
func main()
{
	let task: LongestSubsequence = LongestSubsequence();
	let s1: String = "XYZXYZXXZ";
	let s2: String = "XZYXZYX";
	task.lcs(s1, s2);
}
main();

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX
/*
  Kotlin Program for
  Print all longest common subsequence 
*/
class LongestSubsequence
{
	// Returns the max value of given two numbers
	fun maxValue(a: Int, b: Int): Int
	{
		if (a > b)
		{
			return a;
		}
		else
		{
			return b;
		}
	}
	// Returns the length of common substring
	fun lcsLength(s1: String, s2: String, n1: Int, n2: Int, i: Int, j: Int): Int
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return 0;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			return 1 + this.lcsLength(s1, s2, n1, n2, i + 1, j + 1);
		}
		else
		{
			// Through recursively find similar characters
			return this.maxValue(this.lcsLength(s1, s2, n1, n2, i + 1, j),
                                 this.lcsLength(s1, s2, n1, n2, i, j + 1));
		}
	}
	// Display the result
	fun printResult(s: String, visit: Array <Boolean> , n: Int): Unit
	{
		var i: Int = 0;
		while (i < n)
		{
			if (visit[i] == true)
			{
				print(s[i]);
			}
			i += 1;
		}
		print("\n");
	}
	// Print the all common subsequence in longest length
	fun findLCS(s1: String, s2: String, visit: Array < Boolean > , n1: Int, n2: Int, i: Int, j: Int, k: Int, length: Int): Boolean
	{
		if (i == n1 || j == n2)
		{
			// When string length exceeds
			return false;
		}
		else if (s1[i] == s2[j])
		{
			// When similar characters meet
			visit[i] = true;
			if (k + 1 == length)
			{
				this.printResult(s1, visit, n1);
				visit[i] = false;
				return true;
			}
			else
			{
				this.findLCS(s1, s2, visit, n1, n2, i + 1, j + 1, k + 1, length);
			}
			visit[i] = false;
		}
		else
		{
			// Through recursively find similar characters
			if (this.findLCS(s1, s2, visit, n1, n2, i + 1, j, k, length) 
                || this.findLCS(s1, s2, visit, n1, n2, i, j + 1, k, length))
			{
				return true;
			}
		}
		return false;
	}
	// Handles the request of display longest common subsequence
	fun lcs(s1: String, s2: String): Unit
	{
		// Get the size of string
		var n1: Int = s1.count();
		var n2: Int = s2.count();
		// First find the length of LCS
		var length: Int = this.lcsLength(s1, s2, n1, n2, 0, 0);
		if (length > 0)
		{
			var visit: Array<Boolean> = Array(n1)
			{
				false
			};
			// Print all longest common subsequence of given two strings
			this.findLCS(s1, s2, visit, n1, n2, 0, 0, 0, length);
		}
	}
}
fun main(args: Array<String> ): Unit
{
	var task: LongestSubsequence = LongestSubsequence();
	var s1: String = "XYZXYZXXZ";
	var s2: String = "XZYXZYX";
	task.lcs(s1, s2);
}

Output

XZYXZ
XZYZX
XZXZX
XZXYX
XYXZX
XYXYX
XYZYX




Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment