# Hash Table# Prime Number# Frequency Counting

a537 - 10789 - Prime Frequency

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算輸入字串中每個字元的出現頻率,並找出頻率為質數的字元。輸出時,字元需按照 ASCII 值由小到大排列。若沒有字元的頻率為質數,則輸出 "empty"。

解題思路

首先,使用一個布林陣列 p 預先計算出 2 到 2000 之間的質數。接著,對於每個輸入字串,使用一個 map 來統計每個字元的出現頻率。然後,遍歷 map,檢查每個字元的頻率是否為質數(即 p[頻率] 是否為 0)。如果是質數,則將該字元添加到輸出結果中。最後,按照 ASCII 值排序輸出結果,如果沒有質數頻率的字元,則輸出 "empty"。

複雜度分析

  • 時間複雜度: O(N + M),其中 N 是輸入字串的總長度,M 是字串中不同字元的數量。預先計算質數的時間複雜度為 O(2000 log log 2000),可以視為常數時間。統計頻率的時間複雜度為 O(N),遍歷 map 的時間複雜度為 O(M)。
  • 空間複雜度: O(2001 + M),其中 2001 是質數陣列的大小,M 是字串中不同字元的數量。

程式碼

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(){
	int p[2001]={1,1},con=1;
	for(int i=2;i<=45;i++)
		for(int j=i+i;j<2001;j+=i)
			p[j]=1;
	string a;
	cin >> a;
	while(cin >> a){
		map <char,int> m;
		bool d=0;
		for(int i=a.length()-1;i>=0;i--)
			m[a[i]]++;
		cout << "Case " << con << ": ";
		con++;
		for(auto i=m.begin();i!=m.end();i++){
			if(p[i -> second]==0){
				cout << i -> first;
				d=1;
			}
		}	
		if(d==0)cout << "empty";
		cout << "\n";
	}
}

Discussion