本文概述
- C ++
- Java
- Python3
- C#
例子:
【打印数组A[]中的所有字符串,并将数组B[]中的所有字符串作为子序列】输入:A [] = {"geeksforgeeks", "mapple", "twitter", "table", "Linkedin"}, B [] = {"e", "l"}简单的方法:
输出:mapple tablelinkedin
说明:两者字符串"e"和"l"是"mapple", "table", "linkedin"中的子集。
输入:A [] = {"geeksforgeeks", "topcoder", "leetcode"}, B [] = {"geek", "ee"}
输出:geeksforgeeks
说明:B [], {"geek", "ee"}仅出现在"geeksforgeeks"中。
解决这个问题最简单的方法是遍历数组A[],对于每个字符串,检查数组B[]中的所有字符串是否作为子序列存在。
时间复杂度:O(N^2 * L),其中length表示数组a[]中字符串的最大长度
辅助空间:O(1)
高效方法:
要优化上述方法, 请按照以下步骤操作:
初始化矩阵A_fre[][],其中A_fre[i]存储第i个字符串中每个字符的频率。
初始化B_fre[]来存储数组B[]中所有字符的频率。
遍历数组A[],对于每个字符串,检查一个字符在数组B[]中的字符串中是否比在A[]中的ith字符串中有更多的频率,即。
如果A_fre [i] [j] < B_fre [j], 其中A_fre [i] [j]:A []中第i个字符串中具有ASCII值('a'+ j)的字符的频率。 B_fre [j]:B []字符串中具有ASCII值('a'+ j)的字符的频率。那么该字符串中至少有一个字符串B []这不是它的子序列。
如果上述条件不满足A[]中的任何字符串的所有字符,则输出该字符串作为一个答案。
检查A[]中的所有字符串后,如果没有发现有B[]中的所有字符串作为其固有子集,则打印-1。
下面是上述方法的实现:
C ++
// C++ Program to implement the
// above approach
#include <
bits/stdc++.h>
using namespace std;
// Function to find strings from A[]
// having all strings in B[] as subsequence
void UniversalSubset(vector<
string>
A, vector<
string>
B)
{
// Calculate respective sizes
int n1 = A.size();
int n2 = B.size();
// Stores the answer
vector<
string>
res;
// Stores the frequency of each
// character in strings of A[]
int A_fre[n1][26];
for ( int i = 0;
i <
n1;
i++) {
for ( int j = 0;
j <
26;
j++)
A_fre[i][j] = 0;
}// Compute the frequencies
// of characters of all strings
for ( int i = 0;
i <
n1;
i++) {
for ( int j = 0;
j <
A[i].size();
j++) {
A_fre[i][A[i][j] - 'a' ]++;
}
}// Stores the frequency of each
// character in strings of B[]
// each character of a string in B[]
int B_fre[26] = { 0 };
for ( int i = 0;
i <
n2;
i++) {
int arr[26] = { 0 };
for ( int j = 0;
j <
B[i].size();
j++) {arr[B[i][j] - 'a' ]++;
B_fre[B[i][j] - 'a' ]
= max(B_fre[B[i][j] - 'a' ], arr[B[i][j] - 'a' ]);
}
}for ( int i = 0;
i <
n1;
i++) {
int flag = 0;
for ( int j = 0;
j <
26;
j++) {// If the frequency of a character
// in B[] exceeds that in A[]
if (A_fre[i][j] <
B_fre[j]) {// A string exists in B[] which
// is not a proper subset of A[i]
flag = 1;
break ;
}
}// If all strings in B[] are
// proper subset of A[]
if (flag == 0)
// Push the string in
// resultant vector
res.push_back(A[i]);
}// If any string is found
if (res.size()) {// Print those strings
for ( int i = 0;
i <
res.size();
i++) {
for ( int j = 0;
j <
res[i].size();
j++)
cout <
<
res[i][j];
}cout <
<
" " ;
}// Otherwise
else
cout <
<
"-1" ;
}// Driver code
int main()
{
vector<
string>
A = { "geeksforgeeks" , "topcoder" , "leetcode" };
vector<
string>
B = { "geek" , "ee" };
UniversalSubset(A, B);
return 0;
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG {// Function to find strings from A[]
// having all strings in B[] as subsequence
static void UniversalSubset(List<
String>
A, List<
String>
B)
{ // Calculate respective sizes
int n1 = A.size();
int n2 = B.size();
// Stores the answer
List<
String>
res = new ArrayList<
>
();
// Stores the frequency of each
// character in strings of A[]
int [][] A_fre = new int [n1][ 26 ];
for ( int i = 0 ;
i <
n1;
i++)
{
for ( int j = 0 ;
j <
26 ;
j++)
A_fre[i][j] = 0 ;
} // Compute the frequencies
// of characters of all strings
for ( int i = 0 ;
i <
n1;
i++)
{
for ( int j = 0 ;
j <
A.get(i).length();
j++)
{
A_fre[i][A.get(i).charAt(j) - 'a' ]++;
}
} // Stores the frequency of each
// character in strings of B[]
// each character of a string in B[]
int [] B_fre = new int [ 26 ];
for ( int i = 0 ;
i <
n2;
i++)
{
int [] arr = new int [ 26 ] ;
for ( int j = 0 ;
j <
B.get(i).length();
j++)
{
arr[B.get(i).charAt(j) - 'a' ]++;
B_fre[B.get(i).charAt(j) - 'a' ] = Math.max(
B_fre[B.get(i).charAt(j) - 'a' ], arr[B.get(i).charAt(j) - 'a' ]);
}
} for ( int i = 0 ;
i <
n1;
i++)
{
int flag = 0 ;
for ( int j = 0 ;
j <
26 ;
j++)
{ // If the frequency of a character
// in B[] exceeds that in A[]
if (A_fre[i][j] <
B_fre[j])
{ // A string exists in B[] which
// is not a proper subset of A[i]
flag = 1 ;
break ;
}
} // If all strings in B[] are
// proper subset of A[]
if (flag == 0 ) // Push the string in
// resultant vector
res.add(A.get(i));
} // If any string is found
if (res.size() != 0 )
{ // Print those strings
for ( int i = 0 ;
i <
res.size();
i++)
{
for ( int j = 0 ;
j <
res.get(i).length();
j++)
System.out.print(res.get(i).charAt(j));
}
System.out.print( " " );
} // Otherwise
else
System.out.print( "-1" );
}// Driver code
public static void main (String[] args)
{
List<
String>
A = Arrays.asList( "geeksforgeeks" , "topcoder" , "leetcode" );
List<
String>
B = Arrays.asList( "geek" , "ee" );
UniversalSubset(A, B);
}
}// This code is contributed by offbeat
Python3
# Python3 program to implement
# the above approach# Function to find strings from A[]
# having all strings in B[] as subsequence
def UniversalSubset(A, B):# Calculate respective sizes
n1 = len (A)
n2 = len (B)# Stores the answer
res = []# Stores the frequency of each
# character in strings of A[]
A_freq = [[ 0 for x in range ( 26 )]
for y in range (n1)]# Compute the frequencies
# of characters of all strings
for i in range (n1):
for j in range ( len (A[i])):
A_freq[i][ ord (A[i][j]) - ord ( 'a' )] + = 1# Stores the frequency of each
# character in strings of B[]
# each character of a string in B[]
B_freq = [ 0 ] * 26for i in range (n2):
arr = [ 0 ] * 26for j in range ( len (B[i])):
arr[ ord (B[i][j]) - ord ( 'a' )] + = 1B_freq[ ord (B[i][j]) - ord ( 'a' )] = max (
B_freq[ ord (B[i][j]) - ord ( 'a' )], arr[ ord (B[i][j]) - ord ( 'a' )])for i in range (n1):
flag = 0
for j in range ( 26 ):# If the frequency of a character
# in B[] exceeds that in A[]
if (A_freq[i][j] <
B_freq[j]):# A string exists in B[] which
# is not a proper subset of A[i]
flag = 1
break# If all strings in B[] are
# proper subset of A[]
if (flag = = 0 ):# Push the string in
# resultant vector
res.append(A[i])# If any string is found
if ( len (res)):# Print those strings
for i in range ( len (res)):
for j in range ( len (res[i])):
print (res[i][j], end = "")# Otherwise
else :
print ( - 1 , end = "")# Driver code
if __name__ = = '__main__' :A = [ "geeksforgeeks" , "topcoder" , "leetcode" ]
B = [ "geek" , "ee" ]UniversalSubset(A, B)# This code is contributed by Shivam Singh
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{// Function to find strings from []A
// having all strings in []B as subsequence
static void UniversalSubset(List<
String>
A, List<
String>
B)
{// Calculate respective sizes
int n1 = A.Count;
int n2 = B.Count;
// Stores the answer
List<
String>
res = new List<
String>
();
// Stores the frequency of each
// character in strings of []A
int [, ] A_fre = new int [n1, 26];
for ( int i = 0;
i <
n1;
i++)
{
for ( int j = 0;
j <
26;
j++)
A_fre[i, j] = 0;
}// Compute the frequencies
// of characters of all strings
for ( int i = 0;
i <
n1;
i++)
{
for ( int j = 0;
j <
A[i].Length;
j++)
{
A_fre[i, A[i][j] - 'a' ]++;
}
}// Stores the frequency of each
// character in strings of []B
// each character of a string in []B
int [] B_fre = new int [26];
for ( int i = 0;
i <
n2;
i++)
{
int [] arr = new int [26];
for ( int j = 0;
j <
B[i].Length;
j++)
{
arr[B[i][j] - 'a' ]++;
B_fre[B[i][j] - 'a' ] = Math.Max(
B_fre[B[i][j] - 'a' ], arr[B[i][j] - 'a' ]);
}
}for ( int i = 0;
i <
n1;
i++)
{
int flag = 0;
for ( int j = 0;
j <
26;
j++)
{// If the frequency of a character
// in []B exceeds that in []A
if (A_fre[i, j] <
B_fre[j])
{// A string exists in []B which
// is not a proper subset of A[i]
flag = 1;
break ;
}
}// If all strings in []B are
// proper subset of []A
if (flag == 0)// Push the string in
// resultant vector
res.Add(A[i]);
}// If any string is found
if (res.Count != 0)
{// Print those strings
for ( int i = 0;
i <
res.Count;
i++)
{
for ( int j = 0;
j <
res[i].Length;
j++)
Console.Write(res[i][j]);
}
Console.Write( " " );
}// Otherwise
else
Console.Write( "-1" );
}// Driver code
public static void Main(String[] args)
{
List<
String>
A = new List<
String>
();
A.Add( "geeksforgeeks" );
A.Add( "topcoder" );
A.Add( "leetcode" );
List<
String>
B = new List<
String>
();
B.Add( "geek" );
B.Add( "ee" );
UniversalSubset(A, B);
}
}// This code is contributed by amal kumar choubey
输出如下:
geeksforgeeks
时间复杂度:O(N * * L), 其中length表示数组A []中字符串的最大长度。
辅助空间:O(N)
推荐阅读
- 按字典顺序,给定字符串的所有最短回文子字符串
- CRASH()宏–用法解释
- 如何创建和访问Python包(详细示例)
- 创建具有O和X的交替矩形的矩阵
- 使用tkinter在Python中创建是/否消息框
- 自激活W10纯净版 雨林木风64位WIN8.1专业版推荐
- 雨林木风纯净专业版Win8.1系统推荐
- 免激活W8 Win8之家Win8.1 64位专业版推荐下载
- xtzj w8专业版 破解版Win8 64位纯净版更新及下载