题解:B4267 [朝阳区小学组 2019] word

· · 题解

主要思路

首先特判字符串为空的情况,按照题目输出 0

对于正常字符串,可以用到 findsubstr 这两个 string 自带的函数。依次找到空格的位置,并截取上一个空格的下一个字符到这个空格的前一个字符,用 vector 存储下来。

当空格都找到后时,由于排除了空字符串的情况,所以最后一个空格后一定还有一个字符串,例如 a ba 后的空格是最后一个空格,但最后还有单词 b。最后输出 vector 长度并排序输出。

AC Code

#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long ll;
typedef long double db;
const int INT_INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
// ----------------------------

// ----------------------------
vector<string> vec;
// ----------------------------

int main() {
    string s;
    int idx, last_idx;
    while (getline(cin, s)) {
        if (s == "") {
            cout << 0 << endl;
            continue;
        }
        vec.clear();  // 注意初始化
        last_idx = 0;
        idx = s.find(" ", last_idx);
        while (idx != s.npos) {
            vec.push_back(s.substr(last_idx, idx - last_idx));  // 第二个参数表示截取长度
            last_idx = idx + 1;  // 取空格的下一个字符
            idx = s.find(" ", last_idx);
        }
        vec.push_back(s.substr(last_idx));
        cout << vec.size() << ' ';
        sort(vec.begin(), vec.end());
        for (string i : vec) cout << i << ' ';
        cout << endl;
    }
    return 0;
}