//三步翻转法
void reverseString(string &str, int start, int end){
if (start > end)
return;
while (start < end)
swap(str[start++], str[end--]);
}
string LeftRotateString(string str, int n){
int len = str.size();
if (len < 0 || len < n)
return str;
reverseString(str, 0, n - 1);
reverseString(str, n, len - 1);
reverseString(str, 0, len - 1);
return str;
}
//拼接字符串
string LeftRotateString2(string str, int n) {
int len = str.length();
if (len == 0) return "";
n = n % len;
str += str;
return str.substr(n, len);
}
//翻转单词顺序列
string ReverseSentence(string str) {
if (str.empty())
return "";
int start = 0, end = str.size() - 1;
reverseString(str, start, end); //先整句翻转然后单个单词翻转
int s = 0; int e = 0;
int i = 0;
while (i < str.size())
{
while (i < str.size() && str[i] == ' ') //空格跳过
i++;
e = s = i; //记录单词的第一个字符的位置
while (i < str.size() && str[i] != ' ') //不是空格 找单词最后一个字符的位置
{
i++;
e++;
}
reverseString(str, s, e - 1); //局部翻转
}
return str;
}
//用栈实现
string ReverseSentence2(string str) {
stack<string> Words;
int currBlankPos = 0;
int perBlankPos = 0;
string subString;
while (currBlankPos >= 0)
{
currBlankPos = str.find_first_of(' ', perBlankPos); // 找到空格分隔字符串(找到word压如栈里头)
subString = str.substr(perBlankPos, currBlankPos < 0 ? (str.length() - perBlankPos) : currBlankPos - perBlankPos); // 按长度截取单词
perBlankPos = currBlankPos + 1;
Words.push(subString); //把单词压如栈
}
subString.clear();
while (!Words.empty())
{
subString += Words.top(); Words.pop();
if (!Words.empty()) subString += " "; // 需不需要加空格
}
return subString;
}