Leetcode算法入门第四天(双指针(3))
344. 反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
样例
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
思路
简单运用双指针的思路,每次都是左右两端节点进行交换,直到左右端点重合,字符串的反转就完成了。
参考代码
class Solution {
public:
void reverseString(vector<char>& s) {
//双指针:每次都是头尾交换
//初始化左指针为0,右指针为数组长度减一
int left=0;
int right=s.size()-1;
while(left<right)
{
//交换左右指针所在元素
char temp=s[left];
s[left]=s[right];
s[right]=temp;
//移动指针
left++;
right--;
}
}
};
557. 反转字符串中的单词 III
题目描述
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
注:
s 包含可打印的 ASCII 字符。
s 不包含任何开头或结尾空格。
s 里 至少 有一个词。
s 中的所有单词都用一个空格隔开。
样例
输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
思路
这道题本质和前一道题思路一致,就是进行单词的反转,这里只是增加了根据空格判断出一个字符串中的单词,对每个单词进行反转:通过遍历整个字符串,遇到空格,就对前面的单词进行反转,需要一个left存储该单词的起点下标,即每个单词区间都是【left,i-1】进行反转。值得注意的是最后一个单词因为结尾没有出现空格,所以要单独进行反转。
参考代码
class Solution {
public:
//反转一个单词
void reverse(string &s,int left,int right)
{
while(left<right)
{
swap(s[left],s[right]);
left++;
right--;
}
}
string reverseWords(string s) {
int n=s.size();
int left=0;
//以空格分割每个单词
for(int i=0;i<n;i++)
{
//找到空格
if(s[i]==' ')
{
reverse(s,left,i-1);
//当前空格不算:下个单词左端点
left=i+1;
}
}
//最后一个单词没变:
reverse(s,left,n-1);
return s;
}
};
最后的话;这几天双指针的题确实有点easy,慢慢来吧,先甜后苦嘛,fighting!!!