力扣刷题:正则表达式匹配、

今日刷题


一、正则表达式匹配

题目链接:https://leetcode.cn/problems/regular-expression-matching/

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符

'*' 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1:

输入:s = "aa", p = "a"

输出:false

解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa", p = "a*"

输出:true

解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

示例 3:

输入:s = "ab", p = "."
输出:true
解释:".
" 表示可匹配零个或多个('*')任意字符('.')。

提示:

1 <= s.length <= 20

1 <= p.length <= 20

s 只包含从 a-z 的小写字母。

p 只包含从 a-z 的小写字母,以及字符 . 和 *。

保证每次出现字符 * 时,前面都匹配到有效的字符

代码(C)

c 复制代码
bool isMatch(char*s,char*p){
  return s[0]=='\0'&&p[0]=='\0'|| s[0]!='\0'&&p[0]!='\0'&&(p[0]=='.'||p[0]==s[0])&&(p[1]=='*'?isMatch(s+1,p):isMatch(s+1,p+1))|| p[0]!='\0'&&p[1]=='*'&&isMatch(s,p+2);
}

二、盛最多水的容器

题目链接:https://leetcode.cn/problems/container-with-most-water/

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]

输出:1

提示:

n == height.length

2 <= n <= 105

0 <= height[i] <= 104

代码(C)

c 复制代码
int maxArea(int* height, int heightSize){
    int max=0,size=0,min=0;//从数组两边遍历,设置两个指针i指向头,j指向尾
    int i=0,j=heightSize-1;
    while(i<j){//遍历
        if(height[i]<height[j])//面积是取最小的height乘长度,并且将短的淘汰留下较长的和后面的继续比较    
            min=height[i++];
        else
            min=height[j--];
        size=(j-i+1)*min;//计算面积
        if(max<size)//面积取遍历的最大值
            max=size;
    }
    return max;
}

三、整数转罗马数字

题目链接:https://leetcode.cn/problems/integer-to-roman/

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值

I 1

V 5

X 10

L 50

C 100

D 500

M 1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。

X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。

C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3

输出: "III"

示例 2:

输入: num = 4

输出: "IV"

示例 3:

输入: num = 9

输出: "IX"

示例 4:

输入: num = 58

输出: "LVIII"

解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994

输出: "MCMXCIV"

解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

1 <= num <= 3999

代码(C)

c 复制代码
char * intToRoman(int num){
    int nums[7] = {1000, 500, 100, 50, 10, 5, 1};
    char roma[8] = "MDCLXVI";
    char *res=malloc(sizeof(char)*16);
    int ptr = 0;
    memset(res, 0 ,16);
    for (int i = 0; i < 7; i++) {
        while (num - nums[i] >= 0) { 
            char tmp[5];
            sprintf(tmp,"%d",num);  //转换为字符串 看第一个字符是不是4或者9
            if (tmp[0] == '4') {
                res[ptr] = roma[i];
                res[ptr + 1] = roma[i - 1];
                ptr += 2;
                num = num + nums[i] - nums[i - 1];
            }else if (tmp[0] == '9') {
                res[ptr] = roma[i + 1];
                res[ptr + 1] = roma[i - 1];
                ptr += 2;
                num = num + nums[i + 1] - nums[i - 1];   
            }else {
                res[ptr] = roma[i];
                ptr++;
                num -= nums[i];
            }           
        }
    }
    return res;
}
相关推荐
IC 见路不走25 分钟前
LeetCode 第91题:解码方法
linux·运维·服务器
翻滚吧键盘38 分钟前
查看linux中steam游戏的兼容性
linux·运维·游戏
小能喵43 分钟前
Kali Linux Wifi 伪造热点
linux·安全·kali·kali linux
汀沿河1 小时前
8.1 prefix Tunning与Prompt Tunning模型微调方法
linux·运维·服务器·人工智能
zly35001 小时前
centos7 ping127.0.0.1不通
linux·运维·服务器
小哥山水之间2 小时前
基于dropbear实现嵌入式系统ssh服务端与客户端完整交互
linux
ldj20202 小时前
2025 Centos 安装PostgreSQL
linux·postgresql·centos
翻滚吧键盘2 小时前
opensuse tumbleweed上安装显卡驱动
linux
凌肖战2 小时前
力扣网编程55题:跳跃游戏之逆向思维
算法·leetcode
黑听人3 小时前
【力扣 简单 C】70. 爬楼梯
c语言·leetcode