字符串题目
1. 仅仅反转字母
题目描述
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
示例 1:
输入:“ab-cd”
输出:“dc-ba”
https://leetcode-cn.com/problems/reverse-only-letters/submissions/
题目分析
用双指针进行判断,当两边都是字母的时候就交换位置,否则,指向不是字母的指针移动,是字母的指针则保持不动,等待交换位置。
C++代码
class Solution {
public:
string reverseOnlyLetters(string S) {
int left = 0;
int right = S.size() - 1;
while(left <= right)
{
if(!isalpha(S[left]))
{
left++;
}
else if(!isalpha(S[right]))
{
right--;
}
else if(isalpha(S[right]) && isalpha(S[left]))
{
swap(S[right],S[left]);
left++;
right--;
}
}
return S;
}
};
2. 反转字符串II
题目描述
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
https://leetcode-cn.com/problems/reverse-string-ii/
题目分析
一次 向后遍历 2*k个长度,直到末尾。
- 每隔 2k 个字符的前 k 个字符进行反转
- 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
- 剩余字符少于 k 个,则将剩余字符全部反转。
C++代码
class Solution {
public:
string reverseStr(string s, int k) {
int len = s.size();
for(int i = 0; i < len; i += 2 * k)
{
if(len - i < 2 *k)
{
if(len - i < k)
{
reverse(s.begin() + i,s.end());
}
else{
reverse(s.begin() + i, s.begin() + i + k);
}
}
else{
reverse(s.begin() + i, s.begin() + i + k);
}
}
return s;
}
};
3. 反转字符串中的单词III
题目描述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/submissions/
题目分析
双指针思想,时间复杂度O(n),空间复杂度O(1)。
使用front跟back指向单词的首尾,然后反转并更新两个指针的值
C++代码
class Solution
{
public:
string reverseWords(string s)
{
if (s.size() == 0){//如果s是空字符串,直接返回
return s;
}
int front = 0, back = 0;//front为要反转的单词的首字母,back为要反转的单词的末字母的下一位
for (int i = 0; i < s.size() - 1; i++)
{
if (s[i] != ' '){
back++;
}
else{
reverse(s.begin() + front, s.begin() + back);
front = back + 1; //当前back指向空格,所以front要从空格的下一个即下一个单词的首字母开始
back = front;//front跟back同一线
}
} //此时最后一部分还没有反转,因为s的末尾不是空格,所以此时back应等于最后一个单词的末字母
back++;
reverse(s.begin() + front, s.begin() + back); //reverse的最后一个参数是要反转的结尾的下一位,back指向s的最后一位,所以要+1
return s;
}
};
4. 倒置字符串
题目描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
题目分析
先将整个字符串逆置过来,再遍历字符串,找出每个单词,对单词逆置。这里我们使用了stl算法中的reverse,所以这里使用迭代器遍历string。
C++代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string s;
getline(cin,s);
reverse(s.begin(),s.end());
int len = s.size();
int front = 0, back = 0;
for(int i =0; i < len - 1; i++)
{
if(s[i] != ' ')
{
back++;
}
else{
reverse(s.begin()+front,s.begin()+back);
front = back + 1;
back = front;
}
}
back++;
reverse(s.begin()+front,s.begin()+back);
cout<<s<<endl;
return 0;
}