题目1:给定一个由单词组成的字符串,输出字符串的反序。
如:input:"i am a student",output:"tneduts a ma i"
#include <iostream>
#include <string>
#include <algorithm>
/*给定一个字符串,输出字符串的反序:
input:"i am a student"
output:"tneduts a ma i"*/
string str_reverse(string strSrc)
{
string str=strSrc;
reverse(str.begin(),str.end());
return str;
}
题目2:给定一个由单词组成的字符串,输出字符串中单词的反序,并保证原字符串中其他内容不变。
如:input:"i am a student",output:"i ma a tneduts"
(1)实现方案1:中间借助少量的内存空间
#include<string>
string str_reverse_word_solution1(string strSrc)
{
string str=strSrc;
string str2;
int start=0,end=0,i=0;
for(i=0;i<str.size();i++)
{
if(str[i]==' ')
{
end=i;
str2=str.substr(start,end-start);
reverse(str2.begin(),str2.end());
str.replace(start,end-start,str2);
start=i+1;
}
}
if(i==str.size())
{
end=str.size();
str2=str.substr(start,end-start);
reverse(str2.begin(),str2.end());
str.replace(start,end-start,str2);
}
return str;
}
(2)方案2:中间不借助其他内存空间
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
string str_reverse_word_solution2(string strSrc)
{
//首先给源字符串最后加一个空格,这样就方便处理串的统一处理,最后再把这个空格删除
string str=strSrc+' ';
auto begin=str.begin(),end=str.begin();
while(end!=str.end())
{
if(*end==' ')
{
reverse(begin,end);
begin=end+1;
}
end++;
}
//删除新增加的空格字符
str.erase(end-1);
return str;
}
题目3:给定一个由单词组成的字符串,将字符串中的单词按倒序输出,保证每个单词的顺序不变。
如:input:"i am a student",output:"student a am i"
此题可以分两步实现:
step1:将整个字符串全部倒序,对应题目1
step2:将倒序后的字符串,针对非空格的单词再次进行翻转,对应题目2
算法实现:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
/*给定一个字符串,输出字符串中单词的反序,保证单词的先后顺序不变:
input:"i am a student"
output:"student a am i"*/
string str_reverse_solution(string str)
{
string strSrc=str;
string str1;
//step1:字符串全部翻转
strSrc=str_reverse(str);
//step2:将每个非空格的单词再次翻转
strSrc=str_reverse_word_solution2(strSrc);
return strSrc;
}
题目4:给定一个由单词组成的字符串,输出字符串中单词的反序,并保证原字符串中其他内容不变。这次需要注意的是字符串中两个单词之间不仅仅是空格字符,有可能是其他非字母的字符。
如:input:"i,am a#student",output:"i,ma a#tneduts"
那么针对此类问题,如果将字符串全部倒序,那么我们前面提供的方法可以不用修改;但是针对题目2的实现,这里就需要做一个简单调整,借助<cctype>中的isalpha()函数(如果是字符,返回TRUE,否则返回FALSE),替换*end==' '或str[i]==' ',这样就没有空格这一个字符的限制,算法实现如下:
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
string str_reverse_word_solution3(string strSrc)
{
//首先给源字符串最后加一个空格,这样就方便处理串的统一处理,最后再把这个空格删除
string str=strSrc+' ';
auto begin=str.begin(),end=str.begin();
while(end!=str.end())
{
//判断是否是非字母字符,而不仅仅是判断是否是空格字符
if(0==isalpha(*end))
{
reverse(begin,end);
begin=end+1;
}
end++;
}
//删除新增加的空格字符
str.erase(end-1);
return str;
}