n 个字符串中的常用字符
给定 n 个字符串,找出所有字符串中的共同字符。简单来说,找到所有字符中出现的字符串,并按字母顺序或字典顺序显示。
注意*我们将考虑字符串仅包含小写字母。
例子:
Input : geeksforgeeks
gemkstones
acknowledges
aguelikes
Output : e g k s
Input : apple
orange
Output : a e
我们将使用两个大小为 26 的哈希数组(对于 az,其中 0 是 a,z 是 25)。
方法很简单,如果我们在标记之前已经看到了一个字符,并且如果我们还没有忽略该字符,因为它不是一个常见的字符。
伪代码:
commonCharacters :
for i= 0 to n-1:
// here m is length of ith string
for j = 0 to m-1:
if ( character seen before ) :
mark the character
else :
ignore it
display all the marked characters
C++
// CPP Program to find all the common characters
// in n strings
#include
using namespace std;
const int MAX_CHAR = 26;
void commonCharacters(string str[], int n)
{
// primary array for common characters
// we assume all characters are seen before.
bool prim[MAX_CHAR];
memset(prim, true, sizeof(prim));
// for each string
for (int i = 0; i < n; i++) {
// secondary array for common characters
// Initially marked false
bool sec[MAX_CHAR] = { false };
// for every character of ith string
for (int j = 0; str[i][j]; j++) {
// if character is present in all
// strings before, mark it.
if (prim[str[i][j] - 'a'])
sec[str[i][j] - 'a'] = true;
}
// copy whole secondary array into primary
memcpy(prim, sec, MAX_CHAR);
}
// displaying common characters
for (int i = 0; i < 26; i++)
if (prim[i])
printf("%c ", i + 'a');
}
// Driver's Code
int main()
{
string str[] = { "geeksforgeeks",
"gemkstones",
"acknowledges",
"aguelikes" };
int n = sizeof(str)/sizeof(str[0]);
commonCharacters(str, n);
return 0;
}
Java
// Java Program to find all the common characters
// in n strings
import java.util.*;
import java.lang.*;
class GFG {
static int MAX_CHAR = 26;
public static void commonCharacters(String str[],
int n)
{
// primary array for common characters
// we assume all characters are seen before.
Boolean[] prim = new Boolean[MAX_CHAR];
Arrays.fill(prim, new Boolean(true));
// for each string
for (int i = 0; i < n; i++) {
// secondary array for common characters
// Initially marked false
Boolean[] sec = new Boolean[MAX_CHAR];
Arrays.fill(sec, new Boolean(false));
// for every character of ith string
for (int j = 0; j < str[i].length(); j++)
{
// if character is present in all
// strings before, mark it.
if (prim[str[i].charAt(j) - 'a'])
sec[str[i].charAt(j) - 'a'] = true;
}
// copy whole secondary array into primary
System.arraycopy(sec, 0, prim, 0, MAX_CHAR);
}
// displaying common characters
for (int i = 0; i < 26; i++)
if (prim[i]){
System.out.print(Character.toChars(i
+ 97));
System.out.print(" ");
}
}
// Driver code
public static void main(String[] args)
{
String str[] = { "geeksforgeeks",
"gemkstones",
"acknowledges",
"aguelikes" };
int n = str.length;
commonCharacters(str, n);
}
}
// This code is contributed by Prasad Kshirsagar
Python3
# Python3 Program to find all the
# common characters in n strings
MAX_CHAR = 26
def commonCharacters(strings, n) :
# primary array for common characters
# we assume all characters are seen before.
prim = [True] * MAX_CHAR
# for each strings
for i in range(n):
# secondary array for common characters
# Initially marked false
sec = [False] * MAX_CHAR
# for every character of ith strings
for j in range(len(strings[i])):
# if character is present in all
# strings before, mark it.
if (prim[ord(strings[i][j]) - ord('a')]) :
sec[ord(strings[i][j]) -
ord('a')] = True
# copy whole secondary array
# into primary
for i in range(MAX_CHAR):
prim[i] = sec[i]
# displaying common characters
for i in range(26):
if (prim[i]) :
print("%c " % (i + ord('a')),
end = "")
# Driver's Code
strings = [ "geeksforgeeks", "gemkstones",
"acknowledges", "aguelikes" ]
n = len(strings)
commonCharacters(strings, n)
# This code is contributed by Niwesh Gupta
C#
// C# Program to find all the
// common characters in n strings
using System;
class GFG
{
static int MAX_CHAR = 26;
public static void commonCharacters(String []str,
int n)
{
// primary array for common characters
// we assume all characters are seen before.
Boolean[] prim = new Boolean[MAX_CHAR];
for(int i = 0; i < prim.Length; i++)
prim[i] = true;
// for each string
for (int i = 0; i < n; i++)
{
// secondary array for common characters
// Initially marked false
Boolean[] sec = new Boolean[MAX_CHAR];
for(int s = 0; s < sec.Length; s++)
sec[s]=false;
// for every character of ith string
for (int j = 0; j < str[i].Length; j++)
{
// if character is present in all
// strings before, mark it.
if (prim[str[i][j] - 'a'])
sec[str[i][j] - 'a'] = true;
}
// Copy whole secondary array into primary
Array.Copy(sec, 0, prim, 0, MAX_CHAR);
}
// Displaying common characters
for (int i = 0; i < 26; i++)
if (prim[i])
{
Console.Write((char)(i + 97));
Console.Write(" ");
}
}
// Driver code
public static void Main(String[] args)
{
String []str = { "geeksforgeeks",
"gemkstones",
"acknowledges",
"aguelikes" };
int n = str.Length;
commonCharacters(str, n);
}
}
// This code is contributed by Rajput-JI
Javascript
输出:
e g k s