字符环 与 变换的矩阵

字符环

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

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

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;
}
相关推荐
早点睡觉好了2 小时前
重排序 (Re-ranking) 算法详解
算法·ai·rag
gihigo19982 小时前
基于全局自适应动态规划(GADP)的MATLAB实现方案
算法
ctyshr3 小时前
C++编译期数学计算
开发语言·c++·算法
zh_xuan3 小时前
最小跳跃次数
数据结构·算法
yumgpkpm4 小时前
2026软件:白嫖,开源,外包,招标,晚进场(2025年下半年),数科,AI...中国的企业软件产业出路
大数据·人工智能·hadoop·算法·kafka·开源·cloudera
孞㐑¥4 小时前
算法—队列+宽搜(bfs)+堆
开发语言·c++·经验分享·笔记·算法
yufuu984 小时前
并行算法在STL中的应用
开发语言·c++·算法
zh_xuan4 小时前
单青蛙跳台阶
数据结构·算法
Kx_Triumphs4 小时前
计算几何-旋转卡壳两种实现方案(兼P1452题解
算法·题解