lintcode-->翻转字符串

时间:2023-03-09 20:38:18
lintcode-->翻转字符串

给定一个字符串,逐个翻转字符串中的每个单词。

您在真实的面试中是否遇到过这个题?
Yes
说明
  • 单词的构成:无空格字母构成一个单词
  • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
  • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

方法1:从后往前依次遍历源字符串src,每次遍历完一个单词后,直接将该单词整个拷贝到另一个字符串dst中,依次遍历原字符串,分别将每个独立的单词拷贝到dst中。

在拷贝字符串是先判断该字符串是否全是空格如果是则不拷贝。

实现:


class Solution {
public:
/*
* @param s: A string
* @return: A string
*/ void *reverse(char *src, char *dst)
{
char *p1, *p2;
if(src == NULL || dst == NULL)
{
return NULL;
}
//从src的最后一个字符开始遍历
p1 = src + strlen(src) - ;
p2 = p1;
while (p1 != src)
{
if (*p1 == ' ')
{
int len = p2 - p1;//单词的长度 memcpy(dst, p1 + , len);
//每个单词的末尾加上一个空格
dst += len;
if(len>)
*dst++ = ' '; p1--;
p2 = p1;
}
else
{
//不断将p1向前移动
p1--;
}
}
//最后一次拷贝单词
int len = p2 - p1 + ;
memcpy(dst, p1, len);
dst += len;
*dst++ ='\0'; } string reverseWords(string &s) {
int i;
int j;
string cstr;
char *str=(char*)calloc(,s.length());
char *dst=(char*)calloc(,s.length());
memcpy(str,s.c_str(),s.length()); if(s.length()==)
return cstr.append(""); reverse(str,dst); return cstr.append(dst);
}
};


方法2:先将每个单词分成独立的几部分,然后分别对它们进行翻转,返回将整个字符串进行翻转

 实现:

 class Solution {
public:
/*
* @param s: A string
* @return: A string
*/ void reverse(char *str, int low, int hight) {
while (low < hight) {
int temp;
temp = str[hight];
str[hight] = str[low];
str[low] = temp;
low++;
hight--;
}
} void space(char *str)
{
int i=;
int j=;
char *s=str; //去掉字符串头部的空格
while(str[i]!='\0')
{
if(str[i]!=' ')
break;
i++;
} while(str[i]!='\0')
{
if(str[i]==' ')
{
s[j]=str[i];
while(str[i]==' ')
i++;
j++;
}else
{
s[j]=str[i];
i++;
j++;
}
}
s[j]='\0';
} string reverseWords(string &s) {
int i;
int j;
string cstr;
char *str=(char*)calloc(,s.length());
memcpy(str,s.c_str(),s.length());
int len = strlen(str);
int num = ; for (int i = ; i <= len; i++) {
if (*(str + i) == ' ' || *(str + i) == '\0') {
reverse(str, i - num, i - );
num = ;
} else {
num++;
}
}
reverse(str, , len - );
space(str); return cstr.append(str);
}
};