字符环 与 变换的矩阵

字符环

现将字符串进行自加,这样就变成寻找两个字符串的最长的连续字符串。

使用滑动窗口法:通过对齐 两个字符串的各个位置,然后向后同时滑动比较,寻找最长的连续匹配。

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;
}
相关推荐
稚南城才子,乌衣巷风流19 分钟前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm25 分钟前
9 找到字符串中所有字母异位词
c++·算法·leetcode
Sw1zzle1 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木1 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b1 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨2 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
啦啦啦啦啦zzzz2 小时前
算法:回溯算法
c++·算法·leetcode
IT探索2 小时前
Linux 查找文件指令总结
linux·算法
Lumos1863 小时前
51单片机从零到实战(完结)——后续学习路线建议
算法