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

今日刷题


一、正则表达式匹配

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

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/

扫描二维码关注公众号,回复: 16909657 查看本文章

给定一个长度为 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)

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)

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;
}


猜你喜欢

转载自blog.csdn.net/weixin_62529383/article/details/133127660
今日推荐