718. Maximum Length of Repeated Subarray

参考答案没看明白,干脆自己想了个办法,算是动态规划的改进版吧,不用开二维数组,最后时间是9ms,95%。先画一个矩阵[A.size()][B.size()],横行代表A,竖列代表B。leetcode给出的动态规划的 参考答案好像是横着遍历矩阵,我是斜着,从左上到右下遍历矩阵,这样就不用开二维数组了。

将矩阵按左上到右下的对角线分成两半。两个   (两层的for循环) ,分别用来遍历这两半。两层for循环:第一层用来从第一行第一个遍历到第一行最后一个,或从第一列第一个遍历到第一列最后一个;第二层for用来向右下移动,直到移动到矩阵边界,第二层循环结束,重回第一层。

int findLength(vector<int>& A, vector<int>& B) {
        int res=0,alen=A.size(),blen=B.size();
        for(int i=0;i<alen;i++){
            int len=0;			//当前subarray长度,不重复就为0.
            for(int j=0;i+j<alen;j++){
                if(A[i+j]==B[j]){	//如果当前字符重复,subarray长度+1
                    len++;
                    if(len>res)		//当前subarray长度比原来最大值大,替换原来最大值。
                        res=len;
                }
                else			//如果当前字符不重复,subarray长度重新设为0.
                    len=0;
            }
        }
        for(int k=0;k<blen;k++){	//遍历矩阵的另外一半,和上面的for循环道理一样。
            int len=0;
            for(int l=0;k+l<blen;l++){
                if(B[k+l]==A[l]){
                    len++;
                    if(len>res)
                        res=len;
                }
                else len=0;
            }
        }
        return res;
    }
时间复杂度应该是O(n*m)吧,空间复杂度应该是O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值