字符环 与 变换的矩阵

字符环

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

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

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;
}
相关推荐
岛雨QA18 小时前
查找算法「Java数据结构与算法学习笔记7」
数据结构·算法
宝贝儿好18 小时前
【强化学习】第十章:连续动作空间强化学习:随机高斯策略、DPG算法
人工智能·python·深度学习·算法·机器人
isyoungboy18 小时前
从图像中提取亚像素边缘点
算法
郝学胜-神的一滴18 小时前
深入理解链表:从基础到实践
开发语言·数据结构·c++·算法·链表·架构
岛雨QA18 小时前
排序算法「Java数据结构与算法学习笔记6」
数据结构·算法
熬夜有啥好18 小时前
Linux软件编程——综合小练习
linux·算法·目录遍历·fgets·strcpy·linux内核与用户交互·strtok
民乐团扒谱机18 小时前
【硬核解析】网易云听歌/哼歌识曲底层技术:从算法实现到工程落地(附核心公式/伪代码)
算法
Z9fish18 小时前
sse哈工大C语言编程练习23
c语言·数据结构·算法
ArturiaZ18 小时前
【day36】
数据结构·c++·算法
山河君18 小时前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa