给定两个字符串小写,找到最长的字符串,其排列是给定两个字符串。输出的最长字符串必须排序。
例子:
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"
我们的想法是在计算两个字符串的字符。
- 计算每个字符串的字符频率,并将它们存储在各自的计数数组中,例如str1的count1 []和str2的count2 []。
- 现在我们有26个字符的计数数组。因此遍历count1 [],对于任何索引’i’,在结果字符串’result’中将字符(’a’+ i)追加min(count1 [i],count2 [i])次。
- 由于我们以升序遍历计数数组,因此最终的字符串字符将按排序顺序。
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)如果您有其他解决此问题的方法,请分享。