字符环 与 变换的矩阵

字符环

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

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

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;
}
相关推荐
姜鱼问生14 分钟前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.20 分钟前
华为题:全排列
算法·深度优先·图论
杜 硕29 分钟前
快速排序详解01
数据结构·算法·排序算法
Matlab程序猿44 分钟前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
信奥卷王1 小时前
[GESP202606 六级] 满二叉树
数据结构·算法
积流成海1 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站
Nil2081 小时前
leetcode 300最长递增子序列
算法·leetcode·职场和发展
垆边人似月.2 小时前
华为机试题 :最大数
c++·算法·华为
zhenaibo5212 小时前
如何与导师有效沟通选题?
算法
熊猫钓鱼>_>2 小时前
大学图论第 6 讲:网络流与二分图匹配——对偶性让瓶颈自己现形
开发语言·算法·面试·职场和发展·图论·校招·面经