leetcode 115. Distinct Subsequences如何改进我的方法

来源:9-1 什么是动态规划

站在巨人的肩膀上丶

2018-04-23

public int numDistinct(String S, String T) {
   int[] memo = new int[S.length()+1];
   for(int i = 0 ; i < memo.length ; i++)
       memo[i] = 1;
   int pre = 0;
   for(int j = 0; j < T.length() ; j++)
   {
       for(int i = 1 ; i <= S.length() ; i++){
           int cur = pre;
           if(T.charAt(j) == S.charAt(i-1))
               cur += memo[i-1];
           memo[i-1] = pre;
           pre = cur;
       }
       memo[S.length()] = pre;
       pre = 0;
   }
   return memo[S.length()];
}

我的算法能做到以空间复杂度O(S的长度)解决这个问题,但提交后通不过OJ依然报出内存溢出,请问波波老师这道题还有更好的压缩空间复杂度的解决方法吗(在面试中做类似动态规划问题需要对问题的进行空间压缩吗)


写回答

2回答

liuyubobobo

2018-04-23

我怀疑现在这个问题在Leetcode上对于Java的OJ有bug。我使用C++,开 O(T * S) 的内存都能通过,但是对于Java,开O(T)的内存,却MLE,实在是不对劲。


对于这个问题,空间可以压缩到O(T)的级别。由于根据题目的描述,应该在大多数情况下,T比S小,所以对于大多数测试用例,O(T)是比O(S)小的:)


至于具体逻辑,你的代码还有优化空间,可以参考我的Java代码:

https://github.com/liuyubobobo/Play-Leetcode/blob/master/0115-Distinct-Subsequences/java-0115/src/Solution2.java

这个空间优化过程的逻辑其实很像背包问题的优化:)


C++可以通过的代码如下链接。其中main.cpp的空间复杂度是 O(T * S)的,也可以通过。。。

https://github.com/liuyubobobo/Play-Leetcode/tree/master/0115-Distinct-Subsequences/cpp-0115


关于这个问题在Leetcode上的判题bug,我去给Leetcode写封邮件问一下:)


至于面试中遇到动态规划问题要不要对空间进行压缩。首先,一定要给出解答!哪怕不是最优的!然后一点一点优化。如果考官一直让你优化,你谈及到对空间的优化,肯定是好的;不过有的时候,考官考动态规划,让你说出转移方程就结束了:)

0
1
站在巨人的肩膀上丶
非常感谢!波波老师
2018-04-23
共1条回复

liuyubobobo

2018-04-24

//img.mukewang.com/szimg/5adebefa000127f410340156.jpg


我刚刚收到了Leetcode的邮件,他们已经修复了这个bug:)我已经测试了,现在我的这些Solution都可以顺利通过了:)https://github.com/liuyubobobo/Play-Leetcode/tree/master/0115-Distinct-Subsequences/java-0115/src


如果你的算法逻辑没有问题,应该也不会MLE了:)


继续加油!

1
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程