剑指offer 51、52:构建乘积数组 、正则表达式匹配

51.题目描述
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]A[i-1]*A[i+1]…*A[n-1]。不能使用除法。
思路:

                    1 2 3 4 5
data1           data2
1           1*2*3*4*5*1
1*1         2*3*4*5*1
1*1*2       3*4*5*1
1*1*2*3     4*5*1
1*1*2*3*4   5*1
1*1*2*3*4*5 1

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        if(A.empty())
            return {};
        int n=A.size();
        vector<int>data(n,1);
        vector<int>data1(n,1);
        vector<int>data2(n,1);
        for(int i=1;i<n;++i)
            data1[i]=data1[i-1]*A[i-1];
        for(int i=n-2;i>=0;--i)
            data2[i]=data2[i+1]*A[i+1];
        for(int i=0;i<n;++i)
            data[i]=data1[i]*data2[i];
        return data;
    }
};
# -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        n=len(A)
        if n==0:
            return A
        data=[1 for i in range(n)]
        data1=[1 for i in range(n)]
        data2=[1 for i in range(n)]
        for i in range(1,n):
            data1[i]=data1[i-1]*A[i-1]
        for i in range(0,n-1)[::-1]:
            data2[i]=data2[i+1]*A[i+1]
        for i in range(0,n):
            data[i]=data1[i]*data2[i]
        return data
        # write code here

52.题目描述
请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配

递归终止条件:
str与pattern都结束 返回true
str不结束 pattern结束 返回false
str不结束 pattern不结束 继续递归
str结束 pattern不结束因为*无法判断,继续递归
*的问题复杂,所以针对*进行分析
下一个字符不为*则只需考虑.,str与pattern同时+1
为*则:aaa  a*a
str[i]==pattern[i] 下一步则需判断aa a*a  a a*a 或者aaa a 等状态。

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(*str=='\0' && *pattern=='\0')
            return true;
        if(*str!='\0' && *pattern=='\0')
            return false;
        if(*(pattern+1)!='*')
        {
            if(*str==*pattern || (*str!='\0')&& *pattern=='.')
                return match(str+1,pattern+1);
            else
                return false;
        }
        else
        {
            if(*str==*pattern || (*str!='\0')&& *pattern=='.')
                return match(str+1,pattern) || match(str,pattern+2);
            else
                return match(str,pattern+2);
        }
        return false;
    }
};
# -*- coding:utf-8 -*-
import re
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        return re.match("(?:" + pattern + r")\Z", s)
        # write code here

猜你喜欢

转载自blog.csdn.net/zd_nupt/article/details/81509291
今日推荐