123
返回列表 发新帖
楼主: ppscyye
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] facebook最高频(就是最高的,没有之一)题目的follow up

 
🔗
leonsu7777 2022-2-9 11:10:51 | 只看该作者
全局:
xp1991112 发表于 2022-2-8 20:09
感觉就是stack解法的follow up?用三个stack 分别记录(,]和}的index。以小括号举个例子,如果遇到的是) ...

这个思路不行吧
如果是{[}, 这个greedy办法会把三个都delete,而最优方案是只删中间一个。
https://leetcode.com/playground/En5cpBhW
回复

使用道具 举报

🔗
sandreandre 2022-2-9 11:31:36 | 只看该作者
全局:
我覺得你可以看一下301? 你把其中一個字元拿掉再去做dfs and check the error number of parentheses <= current error number of parentheses,最後應該可以得到最長的字串!
回复

使用道具 举报

🔗
 楼主| ppscyye 2022-2-9 12:32:34 | 只看该作者
全局:
本帖最后由 ppscyye 于 2022-2-8 23:34 编辑
leonsu7777 发表于 2022-2-8 22:10
这个思路不行吧
如果是{[}, 这个greedy办法会把三个都delete,而最优方案是只删中间一个。
https://lee ...

我看了下你的代码,不是问要删除多少个字符。是要返回删除之后的字符串。

比如输入
abc ( ) { [ } ] ) def
返回
abc ( ) [ ] def 或者 abc ( ) { } def
回复

使用道具 举报

🔗
plich 2022-2-9 12:36:40 | 只看该作者
全局:
我谨慎怀疑出题人兴许觉得  ( [[[ ) ( ]]] ) 这种算match,建议碰到的同学先问一下
回复

使用道具 举报

🔗
 楼主| ppscyye 2022-2-9 12:39:55 | 只看该作者
全局:
sandreandre 发表于 2022-2-8 22:31
我覺得你可以看一下301? 你把其中一個字元拿掉再去做dfs and check the error number of parentheses

我现在能想到的也是利用301递归的思路。
前面利用LC20的思路去判断是否有效,但如果无效很难确定要上那个括号,以及删除多少。
回复

使用道具 举报

🔗
 楼主| ppscyye 2022-2-9 12:44:54 | 只看该作者
全局:
plich 发表于 2022-2-8 23:36
我谨慎怀疑出题人兴许觉得  ( [[[ ) ( ]]] ) 这种算match,建议碰到的同学先问一下

我不确定具体的题目,只是看到论坛里面有人说了这个follow up.
但感觉括号匹配应该和代码一样, ( [[[ ) ( ]]] ) 不算match
回复

使用道具 举报

🔗
sandreandre 2022-2-9 13:55:32 | 只看该作者
全局:
ppscyye 发表于 2022-2-8 21:39
我现在能想到的也是利用301递归的思路。
前面利用LC20的思路去判断是否有效,但如果无效很难确定要上那 ...

我的意思是說,算一算他的invalid parenthes 多少,如果妳把這個括號拿掉導致invalid parentheses 變多就不要做dfs
def removeInvalidParentheses(self, s: str) -> List[str]:
         #check_err改成{[()]} 看看有多少個invalid parentheses
        def check_err(s):
            if not s:
                return 0
            left = 0
            right = 0
            for char in s:
                if char == '(':
                    left += 1
                elif char == ')':
                    if left != 0:
                        left -= 1
                    else:
                        right += 1
            return left + right
        
        def dfs(curr, err_num):
            if err_num == 0:
                res.append(curr)
            for i in range(len(curr)):
                new_s = curr[:i]+curr[i+1:]
                new_err = check_err(new_s)
                # 如果new_err的invalid 括號變少就dfs
                if new_err < err_num and new_s not in visited:
                    visited.add(new_s)
                    dfs(new_s, new_err)
                    
        visited = set()
        res = []
        dfs(s, check_err(s))
        return res
回复

使用道具 举报

🔗
leonsu7777 2022-2-9 13:56:26 | 只看该作者
全局:
我觉得这个followup只能用backtracking 穷举。
用stack 或者blance都是greedy的思路, 其前提是,最近的pair一定是最后配对在一起的。所以看到就可以消掉。
但是如果可以删除,整个问题就变了,因为没法判断现在多余的closing,是否可以跟后面的配对,形成更优解。
打个极端的例子, ( {{{{{ ) }}}}} 最优解是去掉(), 但是没有全局信息,是没有办法作出这个判断的。
回复

使用道具 举报

🔗
ppff2460 2022-2-10 02:24:27 | 只看该作者
全局:
plich 发表于 2022-2-8 23:36
我谨慎怀疑出题人兴许觉得  ( [[[ ) ( ]]] ) 这种算match,建议碰到的同学先问一下

我也是这么怀疑的!! 不然这个follow up和之前的解法太脱节,太怪了(当然也可能是我太菜了- -)。
回复

使用道具 举报

🔗
plich 2022-2-10 03:31:47 | 只看该作者
全局:
ppff2460 发表于 2022-2-9 10:24
我也是这么怀疑的!! 不然这个follow up和之前的解法太脱节,太怪了(当然也可能是我太菜了- -)。

我本觉得这题不错,抄了拿去面下一个幸运儿。
仔细一看难度不对劲儿啊。。。
回复

使用道具 举报

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

本版积分规则

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