題目描述

約翰發現了各式各樣的岩石,每個岩石都是由多種元素組成,每種元素使用小寫英文字母來表示。一種元素可以用來重複組成同種岩石,而每個岩石都有的元素稱為「寶石元素」。給定一個N顆石頭的組成清單,請計算出其中的寶石元素數量。



原題網址

輸入格式

第一行為一個整數N,表示石頭的數量,範圍在1到100之間(包含1和100)。接下來的N行用小寫英文字母表示石頭的組成元素,每行的字元數量範圍在1到100之間(包含1和100)。

輸出格式

輸出寶石元素數量,如果沒有任何寶石元素,輸出0即可。

範例輸入

3
abcdde
baccd
eeabg

範例輸出

2

額外解釋

只有a和b兩種元素可在所有岩石中被找到,因此這堆石頭中有a和b兩個寶石元素。

解題概念

宣告一個長度為26的整數陣列,用來儲存26個字元在不同的岩石中出現的次數,且在同一顆岩石中重複出現的話只算一次。一開始先讀入整數N,接著再分別讀取N個岩石的組成資料。逐一測試26個字母在該顆岩石中有沒有出現過,如果有的話,整數陣列的中該字母的次數就要加一。加完所有N個岩石的結果之後,最後利用Java 8的串流過濾功能,輸出出現次數為N的陣列元素數量,即為寶石元素的數量。

參考答案

import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.Stream;

public class Solution {

    public static void main(final String[] args) {
        final Scanner sc = new Scanner(System.in);

        final int n = Integer.parseInt(sc.nextLine());
        final Integer[] counter = new Integer[26];
        Arrays.fill(counter, 0);
        for (int i = 0; i < n; ++i) {
            final char[] s = sc.nextLine().toCharArray();
            final int length = s.length;

            ALPHABET:
            for (int j = 0; j < 26; ++j) {
                final char cc = (char) (j + 'a');
                for (int k = 0; k < length; ++k) {
                    final char c = s[k];
                    if (c == cc) {
                        ++counter[j];
                        continue ALPHABET;
                    }
                }
            }
        }
        System.out.println(Stream.of(counter).filter(a -> a == n).count());
    }
}