字符串逆序

本文介绍字符串逆序的多种方法,包括反向拷贝、原地逆序、递归逆序及异或逆序,特别针对单词逆序提出有效算法。使用STL栈简化单词逆序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义一个字符串,反向拷贝

string ts="";
for(int i=s.length()-1;i+1;i--){
	ts+=s[i];
}

2.原地逆序
不分配额外内存空间
在这里插入图片描述

//s为string类型
int i=0,j=s.length()-1;
while(i<j){
	char c=s[i];
	s[i++]=s[j];
	s[j--]=c;
}

采用递归

void Reverse( string s, int left, int right )
{
    if(left >= right)
        return;
    char t = s[left] ;
    s[left] = s[right] ;
    s[right] = t ;
    Reverse(s, left + 1, right - 1) ;
}

3.不允许临时变量的原地逆序
利用异或,两个变量相同异或为全0,全0异或任何变量都为变量本身

int i=0,j=s.length()-1;
while(i<j){
	s[i]=s[i]^s[j];
	s[j]=s[i]^s[j];
	s[i]=s[i++]^s[j--];
}

4.单词逆序
给定一个字符串,按单词将该字符串逆序,比如给定"This is a sentence",则输出是"sentence a is This".
分两步
1 先按单词逆序得到"sihT si a ecnetnes"
2 再整个句子逆序得到"sentence a is This"
对于步骤一,关键是如何确定单词,这里以空格为单词的分界。当找到一个单词后,就可以使用上面讲过的方法将这个单词进行逆序,当所有的单词都逆序以后,将整个句子看做一个整体(即一个大的包含空格的单词)再逆序一次即可。

//s中left到right逆序
string ReverseWord(string s,int left,int right)
{
	while(left<right){
		s[left]=s[left]^s[right];
		s[right]=s[left]^s[right];
		s[left]=s[left++]^s[right--];
	}
	return s;
}
//句子按单词逆序
string ReverseSentence(string s)
{
	int i=0,j=0;
	while(j<s.length()){
		if(s[j]==' '){
			s=ReverseWord(s,i,j-1);
			i=++j;// 指向下一个单词首字符
		}
		else
			j++;
	}
	s=ReverseWord(s,i,j-1);// 对最后一个单词逆序
	s=ReverseWord(s,0,j-1);
	return s;// 对整个句子逆序
}

对这道题使用STL栈更简单

stack<string> s;
string ts;
while(cin>>ts){
	s.push(ts);
}
while(!s.empty()){
	cout<<s.top()<<" ";
	s.pop();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值