e570 - 賓語提前
題目描述
題目要求將給定的中文字串,其中包含 "之" 或 "是" 結構助詞的句子,將助詞後面的部分移到字串的最前面,還原成正常的語序。
解題思路
程式碼的核心邏輯是找到字串中 "之" 或 "是" 的位置,然後將字串分割成兩個部分:助詞之前的部分(賓語)和助詞之後的部分(述語)。最後,將述語部分移動到字串的最前面,並輸出重新組成的字串。由於題目說明中文字串每個字佔三個位元組,因此程式碼在處理字串時,每次以三個位元組為單位進行操作。
複雜度分析
- 時間複雜度: O(n),其中 n 是輸入字串的長度。程式碼需要遍歷字串一次來查找 "之" 或 "是",然後進行字串分割和重新組合。
- 空間複雜度: O(n),因為程式碼需要創建新的字串
b和c來存儲分割後的字串部分,在最壞情況下,這些字串可能與原始字串的大小相同。
程式碼
#include <iostream>
using namespace std;
string t="之",s="是";
int main(){
string a;
while(cin >> a){
int i=0,al=a.length();
string b,c;
for(;i<al;i+=3){
if((a[i]==t[0]&&a[i+1]==t[1]&&a[i+2]==t[2])||(a[i]==s[0]&&a[i+1]==s[1]&&a[i+2]==s[2])){
break;
}
b+=a[i];
b+=a[i+1];
b+=a[i+2];
}
for(i+=3;i<al;i+=3){
c+=a[i];
c+=a[i+1];
c+=a[i+2];
}
cout <<c<<b<< "\n";
}
}