给定一个字符串,逐个翻转字符串中的每个单词。
示例1
输入: "the sky is blue"
输出: "blue is sky the"
示例2
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例3
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
class Solution {
public:
vector<string> my_split(string str,string delim){
vector<string> res;
if("" == str) return res;
char* strs = new char[str.length() + 1];
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while(p) {
string s = p;
res.push_back(trim(s));
p = strtok(NULL, d);
}
reverse(res.begin(),res.end());
return res;
}
string trim(string &s)
{
if (s.empty())
{
return s;
}
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
return s;
}
string print(vector<string> v){
stringstream ss;
for(size_t i = 0; i < v.size(); ++i)
{
if(i != 0)
ss << " ";
ss << v[i];
}
return ss.str();
}
string reverseWords(string s) {
return print(my_split(trim(s)," "));
}
};
class Solution {
public:
string reverseWords(string s) {
stringstream ss(s);
string str;
vector<string> tmp;
while (ss >> str){
tmp.push_back(str);
}
string ans;
for (int i = tmp.size() - 1; i >= 0; i--){
ans += tmp[i] + " ";
}
return ans.size() ? string(ans.begin(), ans.end() - 1) : "";
}
};
写一大堆c++标准库里面没有的函数就可以,其实用python一行就能解决,但是写起来比较累容易出错。
其实也可以利用stringstream可以自动去空格的特性,写起来很快也很容易理解,就是一个逆序处理需要注意下,对时间影响比较大。