logo

Lengste felles undersekvens med permutasjoner tillatt

Gitt to strenger med små bokstaver, finn den lengste strengen hvis permutasjoner er undersekvenser av gitte to strenger. Den lengste utdatastrengen må sorteres.

Eksempler:  

Input : str1 = 'pink' str2 = 'kite' Output : 'ik' The string 'ik' is the longest sorted string whose one permutation 'ik' is subsequence of 'pink' and another permutation 'ki' is subsequence of 'kite'. Input : str1 = 'working' str2 = 'women' Output : 'now' Input : str1 = 'geeks'  str2 = 'cake' Output : 'ek' Input : str1 = 'aaaa'  str2 = 'baba' Output : 'aa'
Anbefalt: Vennligst løs det på ' PRAKSIS ' først før du går videre til løsningen.

Tanken er å telle tegn i begge strengene. 



  1. beregne frekvensen av tegn for hver streng og lagre dem i deres respektive tellematriser, si count1[] for str1 og count2[] for str2.
  2. Nå har vi tellematriser for 26 tegn. Så gå gjennom count1[] og for enhver indeks 'i' legg til tegnet ('a'+i) i den resulterende strengen 'result' med min(count1[i] count2[i]) ganger.
  3. Siden vi krysser tellematrisen i stigende rekkefølge, vil våre siste strengtegn være i sortert rekkefølge.

Implementering:

C++
// C++ program to find LCS with permutations allowed #include   using namespace std; // Function to calculate longest string // str1 --> first string // str2 --> second string // count1[] --> hash array to calculate frequency // of characters in str1 // count[2] --> hash array to calculate frequency // of characters in str2 // result --> resultant longest string whose // permutations are sub-sequence of given two strings void longestString(string str1 string str2) {  int count1[26] = {0} count2[26]= {0};  // calculate frequency of characters  for (int i=0; i<str1.length(); i++)  count1[str1[i]-'a']++;  for (int i=0; i<str2.length(); i++)  count2[str2[i]-'a']++;  // Now traverse hash array  string result;  for (int i=0; i<26; i++)  // append character ('a'+i) in resultant  // string 'result' by min(count1[i]count2i])  // times  for (int j=1; j<=min(count1[i]count2[i]); j++)  result.push_back('a' + i);  cout << result; } // Driver program to run the case int main() {  string str1 = 'geeks' str2 = 'cake';  longestString(str1 str2);  return 0; } 
Java
//Java program to find LCS with permutations allowed class GFG { // Function to calculate longest String // str1 --> first String // str2 --> second String // count1[] --> hash array to calculate frequency // of characters in str1 // count[2] --> hash array to calculate frequency // of characters in str2 // result --> resultant longest String whose // permutations are sub-sequence of given two strings  static void longestString(String str1 String str2) {  int count1[] = new int[26] count2[] = new int[26];  // calculate frequency of characters  for (int i = 0; i < str1.length(); i++) {  count1[str1.charAt(i) - 'a']++;  }  for (int i = 0; i < str2.length(); i++) {  count2[str2.charAt(i) - 'a']++;  }  // Now traverse hash array  String result = '';  for (int i = 0; i < 26; i++) // append character ('a'+i) in resultant  // String 'result' by min(count1[i]count2i])  // times  {  for (int j = 1; j <= Math.min(count1[i] count2[i]); j++) {  result += (char)('a' + i);  }  }  System.out.println(result);  } // Driver program to run the case  public static void main(String[] args) {  String str1 = 'geeks' str2 = 'cake';  longestString(str1 str2);  } } /* This java code is contributed by 29AjayKumar*/ 
Python3
# Python 3 program to find LCS # with permutations allowed # Function to calculate longest string # str1 --> first string # str2 --> second string # count1[] --> hash array to calculate frequency # of characters in str1 # count[2] --> hash array to calculate frequency # of characters in str2 # result --> resultant longest string whose # permutations are sub-sequence # of given two strings def longestString(str1 str2): count1 = [0] * 26 count2 = [0] * 26 # calculate frequency of characters for i in range( len(str1)): count1[ord(str1[i]) - ord('a')] += 1 for i in range(len(str2)): count2[ord(str2[i]) - ord('a')] += 1 # Now traverse hash array result = '' for i in range(26): # append character ('a'+i) in # resultant string 'result' by # min(count1[i]count2i]) times for j in range(1 min(count1[i] count2[i]) + 1): result = result + chr(ord('a') + i) print(result) # Driver Code if __name__ == '__main__': str1 = 'geeks' str2 = 'cake' longestString(str1 str2) # This code is contributed by ita_c 
C#
// C# program to find LCS with // permutations allowed using System; class GFG { // Function to calculate longest String // str1 --> first String // str2 --> second String // count1[] --> hash array to calculate // frequency of characters in str1 // count[2] --> hash array to calculate // frequency of characters in str2 // result --> resultant longest String whose // permutations are sub-sequence of // given two strings static void longestString(String str1  String str2) {  int []count1 = new int[26];  int []count2 = new int[26];  // calculate frequency of characters  for (int i = 0; i < str1.Length; i++)  {  count1[str1[i] - 'a']++;  }  for (int i = 0; i < str2.Length; i++)  {  count2[str2[i] - 'a']++;  }  // Now traverse hash array  String result = '';  for (int i = 0; i < 26; i++)    // append character ('a'+i) in resultant  // String 'result' by min(count1[i]count2i])  // times  {  for (int j = 1;  j <= Math.Min(count1[i]  count2[i]); j++)  {  result += (char)('a' + i);  }  } Console.Write(result); } // Driver Code public static void Main() {  String str1 = 'geeks' str2 = 'cake';  longestString(str1 str2); } } // This code is contributed // by PrinciRaj1992 
PHP
 // PHP program to find LCS with // permutations allowed // Function to calculate longest string // str1 --> first string // str2 --> second string // count1[] --> hash array to calculate frequency // of characters in str1 // count[2] --> hash array to calculate frequency // of characters in str2 // result --> resultant longest string whose // permutations are sub-sequence of given two strings function longestString($str1 $str2) { $count1 = array_fill(0 26 NULL); $count2 = array_fill(0 26 NULL); // calculate frequency of characters for ($i = 0; $i < strlen($str1); $i++) $count1[ord($str1[$i]) - ord('a')]++; for ($i = 0; $i < strlen($str2); $i++) $count2[ord($str2[$i]) - ord('a')]++; // Now traverse hash array $result = ''; for ($i = 0; $i < 26; $i++) // append character ('a'+i) in resultant // string 'result' by min(count1[$i] // count2[$i]) times for ($j = 1; $j <= min($count1[$i] $count2[$i]); $j++) $result = $result.chr(ord('a') + $i); echo $result; } // Driver Code $str1 = 'geeks'; $str2 = 'cake'; longestString($str1 $str2); // This code is contributed by ita_c ?> 
JavaScript
<script> // Javascript program to find LCS with permutations allowed function min(a b) {  if(a < b)  return a;  else  return b; } // Function to calculate longest String // str1 --> first String // str2 --> second String // count1[] --> hash array to calculate frequency // of characters in str1 // count[2] --> hash array to calculate frequency // of characters in str2 // result --> resultant longest String whose // permutations are sub-sequence of given two strings function longestString( str1 str2)  {  var count1 = new Array(26);  var count2 = new Array(26);  count1.fill(0);  count2.fill(0);  // calculate frequency of characters  for (var i = 0; i < str1.length; i++) {  count1[str1.charCodeAt(i) -97]++;  }  for (var i = 0; i < str2.length; i++) {  count2[str2.charCodeAt(i) - 97]++;  }  // Now traverse hash array  var result = '';  for (var i = 0; i < 26; i++)     // append character ('a'+i) in resultant  // String 'result' by min(count1[i]count2i])  // times  {  for (var j = 1; j <= min(count1[i] count2[i]); j++) {  result += String.fromCharCode(97 + i);  }  }  document.write(result);  }  var str1 = 'geeks';  var str2 = 'cake';  longestString(str1 str2); // This code is contributed by akshitsaxenaa09. </script> 

Produksjon
ek

Tidskompleksitet: O(m + n) hvor m og n er lengder på inndatastrenger.
Hjelpeområde: O(1)

Hvis du har en annen tilnærming til å løse dette problemet, vennligst del.

Oppmerksom leser! Ikke slutt å lære nå. Få tak i alle de viktige DSA-konseptene med DSA Self Paced Course til en studentvennlig pris og bli bransjeklar.  For å fullføre forberedelsene fra å lære et språk til DS Algo og mange flere  se Complete Interview Preparation Course.

Hvis du ønsker å delta på livekurs med eksperter, vennligst se DSA Live Classes for Working Professionals og Competitive Programming Live for Students.