通过翻转实现旋转,顺时针90°旋转 = 上下翻转 + 主对角线翻转,逆时针90° = 左右翻转 + 主对角线翻转。
上下翻转:swap(m[ i ][ j ], m[ n - i - 1 ][ j ])
左右翻转:swap(m[ i ][ j ], m[ i ][ n - j - 1 ])
主对角线翻转:swap(m[ i ][ j ], m[ j ][ i ])
辅对角线翻转:swap(m[ i ][ j ], m[ n - j - 1 ][ n - i - 1 ])
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for(int i = 0; i < n / 2; i ++){
for(int j = 0; j < n; j ++){
swap(matrix[i][j], matrix[n - i - 1][j]);
}
}
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
swap(matrix[i][j], matrix[j][i]);
}
}
return;
}
};
先翻转整个字符串,再依次翻转单词
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int begin = 0, end = s.size() - 1;
while(s[begin] == ' ') begin++;
while(s[end] == ' ') end--;
string ans;
for(int i = begin; i <= end;){
int j = i;
while(j <= end && s[j] != ' ') j++;
reverse(s.begin() + i, s.begin() + j);
ans.append(s.substr(i, j - i) + " ");
while(j <= end && s[j] == ' ') j++;
i = j;
}
return ans.substr(0, ans.size() - 1);
}
};
#include<iostream>
using namespace std;
int main(){
int k;
string a;
cin>>k>>a;
k %= a.size();
string ans = a.substr(a.size() - k, k);
ans.append(a.substr(0, a.size() - k));
cout<<ans;
return 0;
}
28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)
class Solution {
public:
int strStr(string s, string p) {
int j = -1;
vector<int> ne(p.size(), 0);
ne[0] = -1;
for(int i = 1; i < p.size(); i++){
while(j > -1 && p[i] != p[j + 1]) j = ne[j];
if(p[i] == p[j + 1]) j++;
ne[i] = j;
}
j = -1;
for(int i = 0; i < s.size(); i++){
while(j > -1 && s[i] != p[j + 1]) j = ne[j];
if(s[i] == p[j + 1]) j++;
if(j + 1 == p.size()) return i - j;
}
return -1;
}
};
将s首位拼接后,去掉头尾字符,如果剩余字符中存在s,则s由重复子串构成。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string str = s + s;
str = str.substr(1, str.size() - 2);
return strstr(str.c_str(), s.c_str()) != NULL;
}
};
或者用KMP算法实现,若ne[size() - 1] != -1 && len % (len - ne[size() - 1] - 1) == 0,则s由重复子串构成。