字符串翻转问题

//三步翻转法
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值