程序员萌新开始LeetCode刷题之旅,一起互相学习,多多支持。
微信公众号:Deepthinkerr
QQ:2454409598(微信公众号回复不及时,有问题可以QQ联系)
344 反转字符串
题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[]
的形式给出。
不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
思路一:双指针
字符串翻转可以看成对称,以中间轴为对称轴,左右两边的数据交换,具体操作如下:
- 创建两个指针,分别指向数组第一个元素和最后一个元素
- 两个指针的数据交换
- 小指针前进一位,大指针后移一位
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
void reverseString(vector<char>& s) {
int low = 0, high = s.size() - 1;
while(low<high){
swap(s[low], s[high]);
low++;
high--;
}
}
};
557 反转字符串中的单词 III
题目:
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
****提示:******
- 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
思路一:双指针
改题目和 [344 反转字符串](344 反转字符串.md) 相似,这里对一个句子的单词进行翻转,只要找到句子中每个单词的起始和终止位置,然后进行单词翻转,具体步骤如下:
- 查找空格,确定单词的位置
- 翻转单词
时间复杂度:O(N)
空间复杂度:O(1)
class Solution
{
public:
string reverseWords(string s)
{
int low = 0, high;
int n = s.size();
char temp;
for(int i = 0; i <= n; i++){
if (s[i] == ' ' or i == n) // 最后一个单词后没有空格,通过字符串截止来判断
{
high = i - 1;
while (low < high)
{
temp = s[low];
s[low] = s[high];
s[high] = temp;
++low;
--high;
}
low = i + 1;
}
}
return s;
}
};