剑指offer58翻转字符串
Posted shiganquan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer58翻转字符串相关的知识,希望对你有一定的参考价值。
题目一
输入英文句子,翻转句子中单词的顺序,但单词内字符顺序不变,标点当作普通字母处理。
如I am a student. 输出student a am i
思路
第一步翻转整个句子,.tneduts a ma I
第二次翻转每个单词,student. a am I
(代码用了reverse函数,也可以自己写)
若用库函数,需要注意,迭代器的区间表示是前闭后开,[first, last),也就是[first, last-1]
class Solution { public: string ReverseSentence(string str) { reverse(str.begin(),str.end()); int front=0; int back=0; int size = str.size(); while(front < size) { while(front < size && str[front] == ‘ ‘) ++front; back=front; while(back < size && str[back] != ‘ ‘) ++back; reverse(str.begin() + front, str.begin() + back); front = back; } return str; } };
下面是重写ReverseCore,思路一样
class Solution { public: string ReverseSentence(string str) { int front=0; int back=0; int size = str.size(); ReverseCore(str,0, size - 1); while(front < size) { while(front < size && str[front] == ‘ ‘) ++front; back=front; while(back < size && str[back] != ‘ ‘) ++back; ReverseCore(str, front, back - 1); front = back; } return str; } void ReverseCore(string& str, int begin, int end){ if (begin > end) return; while (begin < end) swap(str[begin++], str[end--]); } };
题目二
字符串的左旋操作是把字符串前面若干个字符转移到字符串尾部。如 abcdefg和数字2,输出 cdefgab
思路
借助上题思路,可以理解为 ab cdefg 然后按上述翻转字符串。
思想完全一样,先翻转整个,然后局部翻转。
class Solution { public: string LeftRotateString(string str, int n) { int len = str.size(); if (len == 0 || n > len) return ""; reverse(str.begin(), str.end()); reverse(str.begin(), str.begin() + len - n); reverse(str.begin() + len - n, str.end()); return str; } };
以上是关于剑指offer58翻转字符串的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第8天 | ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串