459. 重复的子字符串 题解 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int n = s.size();
//字串的长度一定是小于母串的一半
for (int n1 = 1; n1 <= n / 2; n1++) {
bool match = 1;
//母串一定是字串的倍数
if (n % n1 == 0) {
//对于母串,s[i - n1] == s[i]
for (int i = n1; i < n; i++) {
if (s[i - n1] != s[i]) {
match = 0;
break;
}
//要加一个遍历完的限制条件,不然只匹配到一个就返回了
if (match && (i == n - 1)) return true;
}
}
}
return false;
}
};
28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle == "") return 0;
int m = haystack.size(), n = needle.size();
for (int i = 0 ; i <= m - n; i++) {
bool flag = 1;
for (int j = 0;j < n; j++) {
if (haystack[i+j] != needle[j]) {
flag = 0;
break;
}
//注意加限制条件
if (flag && j == (n - 1)) return i;
}
}
return -1;
}
};
前两道题都可以用KMP,但是太难了…,先放弃。都需要注意加限制条件
344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0,right = s.size() - 1;
for(;left < right;) {
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
};
双指针反转
541. 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += 2 * k) {
//每隔2k个字符就反转前k个
//如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
int num = s.size() - k;
if(i <= num) {
reverse(s.begin() + i, s.begin() + i + k);
continue;
}
//如果剩余字符少于 k 个,则将剩余字符全部反转
reverse(s.begin() + i, s.begin() + s.size());
}
return s;
}
};
剑指 Offer 05. 替换空格 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
string replaceSpace(string s) {
int count = 0,len1 = s.size();
//记录原字符串有多少空格
for(int i = 0; i < len1; i++) {
if(s[i] == ' ') count++;
}
//根据空格对字符串的长度进行相应的扩充
int len2 = s.size() + (count * 2);
s.resize(len2);
//双指针,一个新长度末尾,一个旧长度末尾,从后向前遍历字符串进行更改
for (int i = len1 - 1, j = len2 - 1; i < j; i--) {
if (s[i] == ' ') {
s[j--] = '0';
s[j--] = '2';
s[j--] = '%';
}else{
s[j--] = s[i];
}
}
return s;
}
};
剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.begin() + n);
reverse(s.begin() + n,s.end());
reverse(s.begin(),s.end());
return s;
}
};
翻转翻转翻转
151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)
解题思路:1、移除多余空格 2、将整个字符串反转 3、将每个单词反转
class Solution {
public:
//移除整个字符串的空格
void removeSpace(string& s) {
int slowIndex = 0,fastIndex = 0;
//删除头部
while (fastIndex < s.size()
&& s[fastIndex] == ' ') fastIndex++;
//删除中间
for (; fastIndex < s.size(); fastIndex++) {
//中间有冗余空格
if (fastIndex > 0 &&
s[fastIndex] == ' ' &&
s[fastIndex] == s[fastIndex - 1]) {
continue;
} else {
s[slowIndex++] = s[fastIndex];
}
}
//删除末尾
if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ' ) {
s.resize(slowIndex - 1);
}else {
s.resize(slowIndex);
}
}
//翻转自己实现
void revers(string& s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseWords(string s) {
//移除整个字符串的空格
removeSpace(s);
//翻转整个字符串
//revers(s, 0, s.size() - 1);
reverse(s.begin(),s.end());
for (int i = 0; i < s.size(); i++) {
int j = i;
//查找单词空格
while(s[j] != ' ' && j < s.size()) j++;
reverse(s.begin() + i,s.begin() + j);
// revers(s, i, j - 1);
i = j;
}
return s;
}
};
翻转有直接的函数,注释掉的是自己实现的。
字符串函数:
1、更改字符串大小 :s.resize( num)
2、字符串翻转 :reverse(s.begin() + n, s.end())
字符串的题目总结:
反转系列,双指针法;数组填充系列,扩容后从后向前双指针;KMP未掌握。