文字列内の単語を逆にする文字列を指定すると、文字列内の各単語を1つずつ逆にします
注:
スペース文字は単語を形成しません。
入力文字列の前後に余分なスペースを含めることができますが、逆の文字を含めることはできません。
2つの単語の間に余分なスペースがある場合は、反転後の単語間のスペースを1つだけに減らします。
分析:文字列を逆にする前に、単語間の余分なスペースを削除する方法について考える必要があります。ここでは、C ++で提供されているisringstreamメソッドのみを使用します(このメソッドを使用しない場合は、ダブルポインターを使用して削除できます)スペース)。各単語を取り出して文字列変数に保存します。
余分なスペースを削除した後、次のことを確認します。全体を逆にすると、単語の順序が逆になり、次に各単語を内部的に逆にしてターゲット文字列を取得します。上図↓
コードは以下の通りです。
class Solution {
public:
void reverse(string& str, int left, int right) {
//反转字符串
while (left < right) {
swap(str[left++], str[right--]);
}
}
string reverseWords(string& s) {
istringstream iss(s);
string tmp;
string str;
while (iss >> tmp) {
str += tmp + ' ';
}
int len = str.length();
str.erase(len - 1);//去掉末尾的' '
int left = 0, right = len - 2;
reverse(str, left, right);
str += ' ';//末尾添上空格符作为标记
right = 0;
while (left < len) {
while (str[right] != ' ' && right < len)
right++;//出循环之后right停留在' '位置
reverse(str, left, right - 1);
left = right++ + 1;
}
str.erase(len - 1);//除去末尾的 ' '
return str;
}
};