344.反转字符串
双指针法,使用了库函数swap(作用是交换两个元素的位置)
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0,right = s.size()-1;
while(left < right){
// char temp = s[left];
// s[left] = s[right];
// s[right] = temp;
//可以使用库函数swap
swap(s[left],s[right]);
left++;
right--;
}
}
};
541. 反转字符串II
使用了库函数reverse(翻转字符串)
class Solution {
public:
string reverseStr(string s, int k) {
int num = s.size(); //获取字符串长度
for(int i = 0;i < num ; i += 2*k){
/*
1. 每隔2k个字符的前k个字符进行反转
2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
*/
if(i + k <= num){
reverse(s.begin() + i,s.begin() + i + k);
}else{
//3. 剩余字符少于k个,则将剩余字符全部反转
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
151.翻转字符串里的单词
解题思路:1、移除多余空格 2、将整个字符串反转 3、将每个单词反转
class Solution {
public:
//翻转
void reverse(string &s,int start,int end){
int i = start,j = end;
while(i < j){
swap(s[i],s[j]);
i++;
j--;
}
}
//移除多余空格
void removeExtraSpaces(string &s){
int slow = 0; //快慢指针删除空格
for(int i = 0;i < s.size();i++){
if(s[i] != ' '){ //删除所有空格
if(slow != 0){ //手动控制空格,给单词之间添加添加空格。slow != 0 说明不是第一个单词,需要在单词前添加空格
s[slow] = ' ';
slow++;
}
while(i < s.size() && s[i] != ' ') //读取字符,遇到空格说明是一个完整的单词
s[slow++] = s[i++];
}
}
s.resize(slow);
}
string reverseWords(string s) {
//去除多余空格,保证单词之间只有一个空格,且字符串首尾没有空格
removeExtraSpaces(s);
//反转整个字符串
reverse(s,0,s.size()-1);
//removeExtraSpaces后保证第一个单词的开始下标一定是0
int start = 0;
for(int i = 0;i <= s.size();i++){
if(i == s.size() || s[i] == ' '){ //到达串尾或者空格,说明一个单词结束,需要对该单词进行翻转
reverse(s,start,i-1); //翻转,注意是左闭右闭的翻转
start = i+1; //更新下一个单词的开始下标start
}
}
return s;
}
};
28. 实现 strStr() (后面补充再做)
KMP算法经典题目
459.重复的子字符串
移动匹配,当一个字符串s:abcabc,内部由重复的子串组成。前面有相同的子串,后面也有相同的子串,那么用s + s,就一定能组成一个s,所以判断字符串是否由重复子串组成,只要两个s拼接在一起,如果中间还出现一个 s 的话,就说明是由重复子串组成。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string str = s + s;
//去掉首部和尾部字符,确保搜索出的是拼接后中间的s,而不是原来的s
str.erase(str.begin());
str.erase(str.end()-1);
if(str.find(s) == std::string::npos)
return false;
return true;
}
};