题意:
按照以下规则划分字符串:
方法一:
直接模拟
思路:模拟。循环遍历字符串,遇到空格,则判断空格是否在双引号内;如果空格不在双引号内,则分割得到一个字符串;否则,不构成一个字符串。
#include <bits/stdc++.h> using namespace std; vector<string> v; int main(){ string s; getline(cin,s);//整行输入 s+=' '; int len=s.size(); int flag=0; string x=""; for(int i=0;i<len;i++){//遍历 if(s[i]==' '){//如果是空格并且不在双引号内,则加入字符串数组 if(flag==0) v.push_back(x),x=""; else x+=s[i]; }else if(s[i]=='"'){//遇到双引号,则改变flag的值 flag=!flag; }else{ x+=s[i]; } } cout << v.size() << endl;//输出 for(int i=0;i<v.size();i++) cout << v[i] << endl; return 0; }
时间复杂度:空间复杂度:
方法二:
边界法
思路:遍历字符串。
当遇到双引号,则获取双引号包裹的字符串;如果是空格,则加入字符串数组。
#include <bits/stdc++.h> using namespace std; vector<string> v; int main(){ string s; getline(cin,s);//整行输入 s+=' '; int len=s.size(); int flag=0; string x=""; for(int i=0;i<len;i++){//遍历 if(s[i]==' '){//如果是空格,则加入字符串数组 v.push_back(x),x=""; }else if(s[i]=='"'){//遇到双引号,则获取双引号包裹的字符串 int j; for(j=i+1;j<len&&s[j]!='"';j++){ x+=s[j]; } i=j; }else{ x+=s[i]; } } cout << v.size() << endl;//输出 for(int i=0;i<v.size();i++) cout << v[i] << endl; return 0; }
时间复杂度:空间复杂度: