c091 - 00576 - Hiaku Review
題目描述
題目要求判斷輸入的俳句是否符合 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";
}
}