剑指 Offer(第2版)面试题 58:翻转字符串
- 剑指 Offer(第2版)面试题 58:翻转字符串
- 题目一:翻转单词顺序
- 思路 1:stringstream
- 思路 2:双指针
- 题目二:左旋转字符串
- 思路 1:字符串分割
- 思路 2:3 次反转字符串
剑指 Offer(第2版)面试题 58:翻转字符串
题目一:翻转单词顺序
题目来源:77. 翻转单词顺序
思路 1:stringstream
代码:
class Solution
{
public:string reverseWords(string s){stringstream ss(s);string word;vector<string> words;while (ss >> word){words.push_back(word);}reverse(words.begin(), words.end());string ans;for (int i = 0; i < words.size(); i++){ans += words[i];if (i != words.size() - 1)ans.push_back(' ');}return ans;}
};
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(n),其中 n 是字符串 s 的长度。
思路 2:双指针
代码:
class Solution
{
public:string reverseWords(string s){if (s.empty())return s;reverse(s.begin(), s.end());int n = s.size();int begin = 0, end = 0;while (begin < n){if (s[begin] == ' '){begin++;end++;}else if (s[end] == ' ' || end == n){reverse(s.begin() + begin, s.begin() + end);begin = end;}elseend++;}return s;}
};
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(n),其中 n 是字符串 s 的长度。
题目二:左旋转字符串
题目链接:78. 左旋转字符串
思路 1:字符串分割
代码:
class Solution
{
public:string leftRotateString(string str, int n){if (n == 0)return str;int len = str.size();n %= len;return str.substr(n) + str.substr(0, n);}
};
复杂度分析:
时间复杂度:O(len),其中 len 是字符串 str 的长度,
空间复杂度:O(1)。
思路 2:3 次反转字符串
代码:
class Solution
{
public:string leftRotateString(string str, int n){if (n == 0)return str;int len = str.size();n %= len;reverse(str.begin(), str.begin() + n);reverse(str.begin() + n, str.end());reverse(str.begin(), str.end());return str;}
};
复杂度分析:
时间复杂度:O(len),其中 len 是字符串 str 的长度,
空间复杂度:O(1)。