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

今日刷题


一、正则表达式匹配

题目链接: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, heighti) 。

找出其中的两条线,使得它们与 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 <= heighti <= 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;
}
相关推荐
AlfredZhao1 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334667 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪9 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈1 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫1 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_961875241 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant