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

谷狗新鲜店面

🔗
byfwh 2018-12-10 04:49:28 | 只看该作者
全局:
stellari 发表于 2018-12-10 04:27
抱歉,我不是楼主……

如果能用来匹配的一定是str2的substring,而非subsequence的话。那只需要把上面 ...

感谢回复
最坏情况先不应该是O(n*m^3)吗
str2总共用m^2个子串 每个子串匹配O(m) 匹配完就下一个
回复

使用道具 举报

🔗
stellari 2018-12-10 05:07:54 | 只看该作者
全局:
byfwh 发表于 2018-12-10 04:49
感谢回复
最坏情况先不应该是O(n*m^3)吗
str2总共用m^2个子串 每个子串匹配O(m) 匹配完就下一个

不是,因为在已知str2[0:k]已经是一个匹配的情况下, 只用O(1)时间就可以分别知道str2[0:k+1], str2[0:k+2]...是否也为一个匹配;而在已知str2[0:k]已经不是匹配的情况下,str2[0:k+1]...就都肯定也不是匹配。也就是说,最多用O(m)时间就可以知道所有从str2的0位置开始的子串的匹配情况。
回复

使用道具 举报

🔗
byfwh 2018-12-10 05:25:46 | 只看该作者
全局:
stellari 发表于 2018-12-10 05:07
不是,因为在已知str2[0:k]已经是一个匹配的情况下, 只用O(1)时间就可以分别知道str2[0:k+1], str2[0:k+ ...

不好意思 我还是不太明白 我举一个极端的例子
str1 = aaax(1000次)
str2 = xxxaaa
要匹配第一个aaa 首先str1中prefix长度取多少不确定 所以从最长开始 6 不是str2中的字串 5 不是str2中的子串 4 不是 3 是 这个过程不是O(m^3)吗 感谢回复
回复

使用道具 举报

🔗
stellari 2018-12-10 06:31:16 | 只看该作者
全局:
byfwh 发表于 2018-12-10 05:25
不好意思 我还是不太明白 我举一个极端的例子
str1 = aaax(1000次)
str2 = xxxaaa

我理解你的意思,但是我不建议你从试遍prefix长度这个思路入手。你可以找str1[i:]分别和str2[0:],str2[1:],……,str2[m-1:]这m个字符串的最长公共前缀(共有m个这样的公共前缀)。这m个公共前缀最长者就是str2中能找到的最长匹配。

评分

参与人数 1大米 +3 收起 理由
fatfatjuju + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
byfwh 2018-12-10 06:37:35 | 只看该作者
全局:
stellari 发表于 2018-12-10 06:31
我理解你的意思,但是我不建议你从试遍prefix长度这个思路入手。你可以找str1分别和str2[0:],str2[1:], ...

我明白你的意思了
针对str2[i:]去和str1[i:]去找最长公共前缀 因为有O(m)个前缀 每个匹配O(m)所以O(N*M^2)
谢谢啦
回复

使用道具 举报

🔗
ch8728487 2018-12-10 12:05:27 | 只看该作者
全局:
但是一旦前缀match上了,就可以跳过这些已经match上的字符串,所以并非O(N) * O(M^2).
假设最坏情况,每次match一个char,每次match为O(M)的,所以总时间还是O(NM)
回复

使用道具 举报

🔗
bear5566 2018-12-10 15:07:15 | 只看该作者
全局:
substring是subsequence的子集
所以subsequence能用的解法应该substring也能套用吧?
回复

使用道具 举报

🔗
c.zhang 2018-12-10 15:38:03 来自APP | 只看该作者
全局:
看大家都在讨论第二题,可不可以说说第一题的思路?
回复

使用道具 举报

🔗
zzwcsong 2018-12-13 12:19:07 | 只看该作者
全局:
请问楼主,我下面的这几个test case是对的吗?


  1. // s1 = "BABA"
  2. // s2 = "CAB"
  3. // false, -1

  4. // s1 = "ABABAB"
  5. // s2 = "CAB"
  6. // true, 3

  7. // s1 = "BABABA"
  8. // s2 = "BABA"
  9. // true, 3

  10. // s1 = "aaaaaa"
  11. // s2 = "aaaa"
  12. // true, 2


复制代码



回复

使用道具 举报

🔗
zzwcsong 2018-12-13 12:47:27 | 只看该作者
全局:
本帖最后由 zzwcsong 于 2018-12-14 00:59 编辑

一点想法,如果修改后的s2 (记作ms2)要能重构成s1,那么ms2一定要是s1的前缀。从所有可能构成s1前缀的ms2出发,由长到短,且ms2需要满足:s1长度是这些前缀长度的整倍数k倍。匹配ms2 k倍,如果存在,倍数k即为答案,如果不行,试长度-1的另一个ms2,如果长度为1都不行,那就是不存在。

举个例子:

  1. // s1 = "BABBABBABBAB" (len1 = 12)
  2. // s2 = "CCBABB" (len2 = 6)
  3. // true, 4

  4. // start from length 6, prefix of s1 is "BABBAB", we can't find it in s2, skip
  5. // start from length 5, 12 is not k times of 5, skip
  6. // start from length 4, prefix of s1 is "BABB", which is a subsequence of s2
  7. //  then we compare, BABB | ABBA | BBAB , 2nd length 4 substring not match, skip
  8. // start from length 3, prefix of s1 is "BAB", which is a subsequence of s2
  9. //  then we compare, BAB | BAB | BAB | BAB ,all length 3 substring match, return value 12 / 3 = 4

  10. // if we get to length 1 prefix of s1, still does't match, we know there is not solution

  11. // time complexity, at worse check  O(len2) times, each comparison, will take O(len1), so it should be O(len1 * len2)

复制代码
回复

使用道具 举报

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

本版积分规则

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