字符环

现将字符串进行自加,这样就变成寻找两个字符串的最长的连续字符串。
使用滑动窗口法:通过对齐 两个字符串的各个位置,然后向后同时滑动比较,寻找最长的连续匹配。
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
cin >> s1 >> s2;
s1 += s1;
s2 += s2;
int n = s1.length(), m = s2.length();
n /= 2;m /= 2;
int max_len = 0;
// 对齐方式:s1的每个字符与s2的每个字符对齐
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int len = 0;
// 比较字符,但长度不能超过原字符串长度
while (len < min(n,m) && s1[i + len] == s2[j + len]) {
len++;
}
max_len = max(max_len, len);
}
}
cout << max_len << endl;
return 0;
}
变化的矩阵

对于奇数N×N矩阵,我们可以逐个检查这几种变换。
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<string> original(n, string(n, ' '));
vector<string> target(n, string(n, ' '));
// 读取原始矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> original[i][j]; // 逐个字符读取
}
}
// 读取目标矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> target[i][j]; // 逐个字符读取
}
}
// 检查是否是顺时针旋转90度
auto isClockwise90 = [&]() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (original[i][j] != target[j][n-1-i]) {
return false;
}
}
}
return true;
};
// 检查是否是逆时针旋转90度
auto isCounterclockwise90 = [&]() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (original[i][j] != target[n-1-j][i]) {
return false;
}
}
}
return true;
};
// 检查是否是旋转180度
auto isRotate180 = [&]() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (original[i][j] != target[n-1-i][n-1-j]) {
return false;
}
}
}
return true;
};
// 检查是否不变
auto isSame = [&]() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (original[i][j] != target[i][j]) {
return false;
}
}
}
return true;
};
// 检查各种变换
if (isClockwise90()) cout << 1 << endl;
else if (isCounterclockwise90()) cout << 2 << endl;
else if (isRotate180()) cout << 3 << endl;
else if (isSame()) cout << 4 << endl;
else cout << 5 << endl;
return 0;
}