楼主: xiaocase
跳转到指定楼层
上一主题 下一主题
收起左侧

前几天的 骨骼店面

🔗
 楼主| xiaocase 2018-8-10 08:41:30 | 只看该作者
全局:
oo小天使oo 发表于 2018-8-10 08:06
我的思路是dp 有不对的地方求地里小伙伴们指点~
dp = A的前i个字符用B拼出的最少次数
首先全部设为Integ ...

我觉得  “B.indexOf(A.substring(j, i)) > 0” 这里有问题。
比如 String A = "abcbdad" ,String B = "abcd"
那么最优构成方案应该是 abc*+*b*d+a**d, return 3
在判断 "bd"这个substring时,B.indexOf("bd") = -1, 然而这里“bd”是可以由B挖掉两个空而得到的。
回复

使用道具 举报

🔗
ljl.lee 2018-8-10 08:44:06 | 只看该作者
全局:
感谢分享!祝好运!
貌似可以先根据B求所有可行路径(子序列),然后在A上求从头到尾的最短路径。B上通过枚举或者dfs(O(2^n))构造可行子序列,可行子序列可以再构造一个trie方便后面查询。A上DP求最短路(O(n * m), 其他最短路径算法应该再快些)。
回复

使用道具 举报

🔗
 楼主| xiaocase 2018-8-10 08:50:37 | 只看该作者
全局:
ljl.lee 发表于 2018-8-10 08:44
感谢分享!祝好运!
貌似可以先根据B求所有可行路径(子序列),然后在A上求从头到尾的最短路径。B上通过 ...

我用的就是DFS求所有可行解,但是没有在中间记录可行子序列。
面之前听说狗家重视交流所以写代码的时候一直在BB,每写一行就讲半天,浪费了一些时间。
现在有点后悔,应该多点时间写代码的,后面想到优化都没时间说。
回复

使用道具 举报

🔗
oo小天使oo 2018-8-10 08:52:50 | 只看该作者
全局:
xiaocase 发表于 2018-8-10 08:41
我觉得  “B.indexOf(A.substring(j, i)) > 0” 这里有问题。
比如 String A = "abcbdad" ,String B =  ...

呀~~~我题目没读清楚 原来中间也可以挖哈哈哈 谢谢楼主指出!
回复

使用道具 举报

🔗
oo小天使oo 2018-8-10 10:31:06 | 只看该作者
全局:
可不可以用一个hashmap存B中character和对应的顺序值
例如 B是“ABCD“” 那么hashmap中 A-1 B-2 C-3 D-4
然后遍历A “ABCACAD”  用一个variable存储所需B的个数
遍历到的char从hashmap中取到他的顺序 然后遍历下一个的时候查看是否下一个的值比上一个大
大的话顺序就是对的可以通过一个B获得
小的话就需要一个新的B
遍历中如果遇到不hashmap存在的key就表示不存在构成方案 返回false或者-1 否则的话返回true或者variable的值
原题和follow up时间复杂度均为O(n)

评分

参与人数 4大米 +14 收起 理由
UUOlidd + 5 欢迎来一亩三分地论坛!
二院老同志 + 1 这样B里面有重复字符怎么办呢
TomD + 3 给你点个赞!
没想好用户名 + 5 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
xxw289 2018-8-10 11:11:25 | 只看该作者
全局:
这题我想用greedy从A中匹配尽量多的B中的元素(用反证法可以证出这样肯定最少),然后双指针扫A和B,B扫完了说明A匹配完了,B指针reset成0匹配A的下一段。代码也很简单(时间复杂度是O(m + n)):
  1. public int minConstruct0(String a, String b) {
  2.         int i = 0;
  3.         int count = 0;
  4.         while (i < a.length()) {
  5.             int j = 0;
  6.             int prev = i;
  7.             while (i < a.length() && j < b.length()) {
  8.                 if (a.charAt(i) == b.charAt(j)) {
  9.                     i++;
  10.                     j++;
  11.                 } else {
  12.                     j++;
  13.                 }
  14.             }
  15.             if (prev == i) return -1;
  16.             count++;
  17.         }
  18.         return count;
  19.     }
复制代码

补充内容 (2018-8-17 02:20):
时间复杂度应该是O(mn).

评分

参与人数 7大米 +28 收起 理由
88888ddddd + 3 给你点个赞!
wzhang80 + 5 给你点个赞!
UUOlidd + 5 欢迎来一亩三分地论坛!
二院老同志 + 5 给你点个赞!
gongteng20001 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| xiaocase 2018-8-10 11:11:29 | 只看该作者
全局:
oo小天使oo 发表于 2018-8-10 10:31
可不可以用一个hashmap存B中character和对应的顺序值
例如 B是“ABCD“” 那么hashmap中 A-1 B-2 C-3 D-4
...

感觉没问题哎
完蛋了完蛋了 居然有O(N)的解法
我用的DFS 时间复杂度高的可怕
凉了凉了
回复

使用道具 举报

🔗
 楼主| xiaocase 2018-8-10 11:11:40 | 只看该作者
全局:
oo小天使oo 发表于 2018-8-10 10:31
可不可以用一个hashmap存B中character和对应的顺序值
例如 B是“ABCD“” 那么hashmap中 A-1 B-2 C-3 D-4
...

感觉没问题哎
完蛋了完蛋了 居然有O(N)的解法
我用的DFS 时间复杂度高的可怕
凉了凉了
回复

使用道具 举报

🔗
 楼主| xiaocase 2018-8-10 11:16:33 | 只看该作者
全局:
xxw289 发表于 2018-8-10 11:11
这题我想用greedy从A中匹配尽量多的B中的元素(用反证法可以证出这样肯定最少),然后双指针扫A和B,B扫完了 ...

感谢!受教了
回复

使用道具 举报

🔗
xxw289 2018-8-10 11:18:30 | 只看该作者
全局:

不敢不敢,我也是先写了个O(n^3)的DP优化了一个小时想出来的。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表