题目描述
题目解析
思路:
- 先将字符串的整理好,比如
I am an 20-years out--standing @ * -stu- dent
变为I am an 20-years out standing stu dent
- 先判断它是不是整数、字符,如果是,表示是一个有效字符,直接追加
- 如果遇到
-
,那么判断它上一个以及下一个是不是整数、字符,如果是,那么表示它是一个连续字符 - 其他情况,用
- 然后用
- 最后反转
#include<bits/stdc++.h>
using namespace std;
bool isValid(char ch){
return isalpha(ch) || isdigit(ch);
}
std::vector<std::string> split(std::string str){
std::vector<std::string> ans;
str += ' ';
int i = 0, s = 0;
// 先跳过开头所有的' '
while (i < str.size() && str[i] == ' '){
i++;
}
s = i; // j是下一个有效字符的起始
while (i < str.size()){
if(str[i] == ' '){
std::string tmp = str.substr(s, i - s);
ans.push_back(tmp);
// 跳过接下来的所有' '
while (i < str.size() && str[i] == ' '){
i++;
}
s = i;
}else{
i++;
}
}
return ans;
}
std::string process(std::string str){
std::string tmp;
for (int i = 0; i < str.size(); ++i) {
if(isValid(str[i])){
tmp.push_back(str[i]);
}else if(str[i] == '-' && isValid(str[i - 1]) && isValid(str[i + 1])){ // -一定会有上一个或者下一个的
tmp.push_back('-'); // 说明是规则1
}else{
tmp.push_back(' ');
}
}
auto vec = split(tmp);
tmp.clear();
std::reverse(vec.begin(), vec.end());
for (const auto & i : vec) {
tmp += i + " ";
}
if(!tmp.empty()){
tmp.pop_back();
}
return tmp;
}
int main(int argc, char **argv)
{
std::cout << process("I am an 20-years out--standing @ * -stu- dent");
}