反转英文句子的意思是将句子中按顺序排好的单词的顺序颠倒过来,例子如下:
输入: wo shi zhong guo ren
输出: ren guo zhong shi wo
直观的解法是先将每个单词提取出来,然后计算每个单词反转后所的位置,最后将单词填到相应的位置上。这种方案不仅占用辅助空间,并且计算复杂。另一种方案是将整个句子看做一个字符串,先反转字符串字母的顺序(包含空格),然后再一次反转每个单词的字母顺序。反转单词字母的意思是:
输入:wo shi zhong guo ren
输出:ner oug gnohz ihs ow
下面看第二种思路的代码:
#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
void ReverseString(char str[],int start,int end)
{
for (int i = start,j = end; i < j; ++i,--j)
{
char c = str[i];
str[i] = str[j];
str[j] = c;
}
}
void ReverseString(char str[])
{
int length = strlen(str);
ReverseString(str,0,length - 1);
}
void ReverseSentence(char str[])
{
ReverseString(str);
vector<int> splitIndex;
int length = strlen(str);
//记录下单词分隔符的位置(空格),句首放置一个虚拟空格
splitIndex.push_back(-1);
for (int i = 0; i < length; ++i)
{
if(str[i] == ‘ ‘)
splitIndex.push_back(i);
}
//句尾放置一个虚拟空格
splitIndex.push_back(length);
int count = splitIndex.size() - 1;
for (int i = 0; i < count; ++i)
{
ReverseString(str,splitIndex[i] + 1,splitIndex[i+1] - 1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char str[] = "wo shi zhong guo ren";
cout<<str<<endl;
ReverseSentence(str);
cout<<str<<endl;
return 0;
}
程序运行截图:
该程序只考虑英文字母输入,并且不考虑标点符号,所有单词以空格分开。
原文地址:http://blog.csdn.net/liao_jian/article/details/44454065