笔试强训day37

旋转字符串

描述

字符串旋转:

给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(可以为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。

例如:如果A='youzan',B='zanyou',A按'you''zan'切割换位后得到'zanyou'和B相同,返回true。

再如:如果A='abcd',B='abcd',A切成'abcd'和''(空串),换位后可以得到B,返回true。

数据范围:A,B字符串长度满足 n≤1000n≤1000,保证字符串中仅包含小写英文字母和阿拉伯数字

进阶: 时间复杂度 O(n)O (n ),空间复杂度 O(n)O (n)

上去先判断s和t的字符串长度是否是相同的,如果是不相同的是不可能通过旋转变成相同的,所以直接返回false就可以了,如果是相同的长度的话,就把s的长度*2,去判断之后的字符串中是否含有t字符串就可以了

cpp 复制代码
class Solution {
public:
    bool solve(string s, string t) {
        // write code here
        if(s.size() != t.size()) return false;
        else return (s+s).find(t)!=-1; 
    }
};

合并k个已排序的链表

描述

合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

数据范围:节点总数 0≤n≤50000≤n ≤5000,每个节点的val满足 ∣val∣<=1000∣val∣<=1000

要求:时间复杂度 O(nlogn)O (nl ogn)

使用一个最小堆,加上一个最小堆的比较规则

cpp 复制代码
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
 struct cmp {
    bool operator()(ListNode* a, ListNode* b) {
        return a->val > b->val; // 假设按节点的值进行比较,值小的优先级高
    }
};
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        // write code here
        priority_queue<ListNode*,vector<ListNode*>,cmp > pq;
        for(auto cur:lists)
        {
            if(cur)pq.push(cur);
        }
        auto dummy = new ListNode(-1);
        auto cur = dummy;
        while(!pq.empty())
        {
            ListNode* node = pq.top();
            pq.pop();
            if(node->next)pq.push(node->next);
            cur->next = node;
            cur = node;
        }
        ListNode* head = dummy->next;
        delete dummy;
        return head;
    }
};

滑雪

描述

给定一个n×m n ×m 的矩阵,矩阵中的数字表示滑雪场各个区域的高度,你可以选择从任意一个区域出发,并滑向任意一个周边的高度严格更低的区域(周边的定义是上下左右相邻的区域)。请问整个滑雪场中最长的滑道有多长?(滑道的定义是从一个点出发的一条高度递减的路线)。

(本题和矩阵最长递增路径类似,该题是当年NOIP的一道经典题)

数据范围: 1≤n,m≤100 1≤n ,m ≤100 ,矩阵中的数字满足 1≤val≤1000 1≤val≤1000

输入描述:

第一行输入两个正整数 n 和 m 表示矩阵的长宽。

后续 n 行输入中每行有 m 个正整数,表示矩阵的各个元素大小。

输出描述:

输出最长递减路线。

解法是记忆化搜索,和矩阵的最长递增路径非常相似,可以参考那道题的代码

cpp 复制代码
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;
int n,m;
const int N = 110;
int g[N][N],memo[N][N];
int dx[4]{1,-1,0,0},dy[4]{0,0,1,-1};

int  dfs(int i,int j)
{
    if(memo[i][j]!=-1)return memo[i][j];
    int ans = 1;
        for(int k = 0;k<4;++k)
        {
            int x = i+dx[k],y=j+dy[k];
            if(x>=0&&x<n&&y>=0&&y<m&&g[x][y] < g[i][j])
            {
                ans = max(ans,dfs(x,y)+1);
            }
        }
        return memo[i][j]=ans;
}
int main()
{
    cin>>n>>m;
    for(int i = 0;i<n;++i)
    {
        for(int j = 0;j<m;++j)
        {
            cin>>g[i][j];
        }
    }
    memset(memo,-1,sizeof memo);
    int ans = 1;
    for(int i = 0;i<n;++i)
    {
        for(int j = 0;j<m;++j)
        {
            ans = max(ans,dfs(i,j));
        }
    }
    cout<<ans<<endl;

    return 0;
}
相关推荐
clock的时钟15 分钟前
暑期数据结构第一天
数据结构·算法
小小小小王王王40 分钟前
求猪肉价格最大值
数据结构·c++·算法
岁忧1 小时前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
BIYing_Aurora1 小时前
【IPMV】图像处理与机器视觉:Lec13 Robust Estimation with RANSAC
图像处理·人工智能·算法·计算机视觉
martian6653 小时前
支持向量机(SVM)深度解析:从数学根基到工程实践
算法·机器学习·支持向量机
孟大本事要学习3 小时前
算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
算法
??tobenewyorker4 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
让我们一起加油好吗4 小时前
【基础算法】贪心 (二) :推公式
数据结构·数学·算法·贪心算法·洛谷
贾全4 小时前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天4 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票