lintcode-->翻转字符串
给定一个字符串,逐个翻转字符串中的每个单词。
说明
- 单词的构成:无空格字母构成一个单词
- 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
- 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
方法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) - 1; p2 = p1; while (p1 != src) { if (*p1 == ' ') { int len = p2 - p1;//单词的长度 memcpy(dst, p1 + 1, len); //每个单词的末尾加上一个空格 dst += len; if(len>0) *dst++ = ' '; p1--; p2 = p1; } else { //不断将p1向前移动 p1--; } } //最后一次拷贝单词 int len = p2 - p1 + 1; memcpy(dst, p1, len); dst += len; *dst++ ='\0'; } string reverseWords(string &s) { int i; int j; string cstr; char *str=(char*)calloc(1,s.length()); char *dst=(char*)calloc(1,s.length()); memcpy(str,s.c_str(),s.length()); if(s.length()==0) return cstr.append(""); reverse(str,dst); return cstr.append(dst); } };
方法2:先将每个单词分成独立的几部分,然后分别对它们进行翻转,返回将整个字符串进行翻转
实现:
1 class Solution { 2 public: 3 /* 4 * @param s: A string 5 * @return: A string 6 */ 7 8 void reverse(char *str, int low, int hight) { 9 while (low < hight) { 10 int temp; 11 temp = str[hight]; 12 str[hight] = str[low]; 13 str[low] = temp; 14 low++; 15 hight--; 16 } 17 } 18 19 void space(char *str) 20 { 21 int i=0; 22 int j=0; 23 char *s=str; 24 25 //去掉字符串头部的空格 26 while(str[i]!='\0') 27 { 28 if(str[i]!=' ') 29 break; 30 i++; 31 } 32 33 34 while(str[i]!='\0') 35 { 36 if(str[i]==' ') 37 { 38 s[j]=str[i]; 39 while(str[i]==' ') 40 i++; 41 j++; 42 }else 43 { 44 s[j]=str[i]; 45 i++; 46 j++; 47 } 48 } 49 s[j]='\0'; 50 } 51 52 string reverseWords(string &s) { 53 int i; 54 int j; 55 string cstr; 56 char *str=(char*)calloc(1,s.length()); 57 memcpy(str,s.c_str(),s.length()); 58 int len = strlen(str); 59 int num = 0; 60 61 for (int i = 0; i <= len; i++) { 62 if (*(str + i) == ' ' || *(str + i) == '\0') { 63 reverse(str, i - num, i - 1); 64 num = 0; 65 } else { 66 num++; 67 } 68 } 69 reverse(str, 0, len - 1); 70 space(str); 71 72 return cstr.append(str); 73 } 74 };
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步