# String Manipulation# Greedy# Conditional Logic

c091 - 00576 - Hiaku Review

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷輸入的俳句是否符合 5/7/5 的音節規則。俳句由三句組成,分別包含 5、7 和 5 個音節。音節的定義是連續的母音字母(a, e, i, o, u, y)序列。如果俳句不符合規則,則輸出不符合規則的句子編號(1、2 或 3)。如果所有句子都符合規則,則輸出 "Y"。

解題思路

程式碼首先讀取俳句的每一行,並將其分割成三個句子。然後,對於每個句子,程式碼計算音節的數量。音節的計算方式是遍歷句子中的每個字符,如果字符是母音,並且下一個字符也是母音,則不計入音節。否則,計入音節。最後,程式碼檢查三個句子的音節數量是否分別為 5、7 和 5。如果全部符合,則輸出 "Y",否則輸出不符合規則的句子編號。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為程式碼需要遍歷輸入字串來計算音節數量。
  • 空間複雜度: O(1),因為程式碼只使用了少量的額外空間來存儲句子和音節數量。

程式碼

#include <iostream>
using namespace std;
int count(string x){
	int xt=0;
	for(int i=0,xl=x.length();i<xl;++i)
		if(x[i]=='a'||x[i]=='e'||x[i]=='i'||x[i]=='o'||x[i]=='u'||x[i]=='y')
			if(x[i+1]=='a'||x[i+1]=='e'||x[i+1]=='i'||x[i+1]=='o'||x[i+1]=='u'||x[i+1]=='y'){}
			else
				++xt;
	return xt;
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	string a;
	while(getline(cin,a)){
		if(a=="e/o/i")break;
		int al=a.length(),it=0;
		string x,y,z;
		while(a[it]!='/'){
			x+=a[it];
			++it;
		}
		++it;
		while(a[it]!='/'){
			y+=a[it];
			++it;
		}
		++it;
		while(it<al){
			z+=a[it];
			++it;
		}
		if(count(x)==5)
			if(count(y)==7)
				if(count(z)==5)
					cout << "Y\n"; 
				else
					cout << "3\n";
			else
				cout << "2\n"; 
		else
			cout << "1\n";
	}
}

Discussion