# String Manipulation# Array# Lookup Table

b515 - 摩斯電碼-商競103

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的摩斯電碼轉換為對應的英文字。輸入包含多組測試資料,每組資料為一串以空格分隔的摩斯電碼,輸出對應的英文字。

解題思路

此題的核心是建立摩斯電碼與字母之間的對應關係。程式使用一個字串陣列 a 儲存了所有字母的摩斯電碼。程式逐行讀取輸入,將每行輸入分割成單個摩斯電碼,然後在 a 陣列中查找匹配的電碼,並輸出對應的字母。由於字母的索引位置與字母的順序相關,因此使用一個字符變數 c 來追蹤當前字母。

複雜度分析

  • 時間複雜度: O(N * M),其中 N 是輸入的摩斯電碼字串的數量,M 是每個字串中摩斯電碼的數量。在最壞的情況下,需要遍歷整個陣列 a 來查找匹配的摩斯電碼。
  • 空間複雜度: O(1),因為使用的額外空間是固定的,不隨輸入大小而變化。

程式碼

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main(){
	string a[26]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
	string b;
	string d;
	getline(cin,b);
	int i=0;
	while(getline(cin,b)){
		int k=0;
		b+=' ';
		char c='@';
		while(k<b.length()){
			for(i=k;b[i]!=' ';i++){
				d+=b[i];
			}
			k+=d.length();
			k++;
			for(int j=0;j<26;j++){
				c++;
				if(d==a[j])
					cout << c;	
			}
			c='@';
			d.clear();
		}
		cout << endl;
	}
}

Discussion