📜  最长的公共子序列,允许排列

📅  最后修改于: 2021-04-29 11:32:44             🧑  作者: Mango

给定两个字符串小写,找到最长的字符串,其排列是给定两个字符串。输出的最长字符串必须排序。

例子:

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"

我们的想法是在计算两个字符串的字符。

  1. 计算每个字符串的字符频率,并将它们存储在各自的计数数组中,例如str1的count1 []和str2的count2 []。
  2. 现在我们有26个字符的计数数组。因此遍历count1 [],对于任何索引’i’,在结果字符串’result’中将字符(’a’+ i)追加min(count1 [i],count2 [i])次。
  3. 由于我们以升序遍历计数数组,因此最终的字符串字符将按排序顺序。
    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


    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*/


    Python 3
    # 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
     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
    ?>


    输出:

    ek
    

    时间复杂度: O(m + n),其中m和n是输入字符串的长度。
    辅助空间: O(1)如果您有其他解决此问题的方法,请分享。