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

今日刷题


一、正则表达式匹配

题目链接: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;
}
相关推荐
GEEK零零七4 分钟前
Leetcode 393. UTF-8 编码验证
算法·leetcode·职场和发展·二进制运算
禁默4 分钟前
Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)
linux·vim·excel
许白掰1 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
longze_75 小时前
Ubuntu连接不上网络问题(Network is unreachable)
linux·服务器·ubuntu
Dirschs6 小时前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
qianshanxue116 小时前
ubuntu 操作记录
linux
AmosTian8 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
这我可不懂11 小时前
Python 项目快速部署到 Linux 服务器基础教程
linux·服务器·python
车车不吃香菇11 小时前
java idea 本地debug linux服务
java·linux·intellij-idea
tan77º12 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip