【问题标题】:Why does this solution fail? Nested and matching brackets为什么这个解决方案会失败?嵌套和匹配括号
【发布时间】:2014-11-09 06:01:22
【问题描述】:

我仍然没有通过测试

  • "negative_match: invalid structures,";
  • "simple_grouped: simple grouped positive and negative test, length=22";
  • "large1 simple large positive test, 100K ('s followed by 100K )'s + )(";和
  • "large2 simple large negative test, 10K+1 ('s followed by 10K )'s + )( + ()"

谁能看到我的错误是什么?我编写的代码适用于我测试的所有字符串...

这里是任务的描述:

N 字符组成的字符串S 被认为是正确的 如果以下任一条件为真,则嵌套:

  • S 为空;
  • S 具有"(U)""[U]""{U}" 的形式,其中U 是正确嵌套的字符串;
  • S 的形式为 "VW",其中 VW 是正确嵌套的字符串。

例如,字符串 "{[()()]}" 是正确嵌套的,但 "([)()]" 是 不是。

写一个函数:

def solution(S)

那个,给定一个字符串SN 字符组成,如果S 正确嵌套并且0,则返回1 否则。例如,给定S = "{[()()]}",函数应该 返回1 并给定S = "([)()]",该函数应返回0,如 上面解释过。

假设:

  • N[0..200,000] 范围内的整数;
  • 字符串S 仅包含以下字符:"(""{""[""]""}" 和/或")"

复杂度:预期的最坏情况时间复杂度为O(N);预期的 最坏情况下的空间复杂度为O(N)(不包括所需的存储空间 用于输入参数)。

这是我的解决方案:

def solution(S):
# write your code in Python 2.7
if S == "":
    return 1
length = len(S)
start = 0
end = length-1

if length%2 != 0:
    return 0

for i in range(0, length):
    if (S[start] == '(') and (S[end] != ')'):
        return 0
    if (S[start] == '[') and (S[end] != ']'):
        return 0
    if (S[start] == '{') and (S[end] != '}'):
        return 0
    start = start +1
    end = end -1

return 1    

pass

【问题讨论】:

  • 扫描一个部分的第一个和最后一个字符的解决方案不适用于您的第一个案例{[()()]},因为最后您将看到中间的字符)( .
  • 提示:由于正确嵌套的定义是递归的,因此使用递归实现测试器通常是最简单的。
  • 由于您的算法似乎适用于您的测试字符串,您需要制作一些更复杂的测试字符串,包括正确嵌套的字符串和错误嵌套的字符串。然后用这些字符串手动“遍历”你的算法(即在纸上手工完成),看看会发生什么。现在使用 dognose 算法做同样的事情。根据我的经验,手动处理算法通常可以帮助我理解如何将其转化为代码。

标签: python regex string algorithm


【解决方案1】:

您正在从从左到右从右到左寻找 - 这将在 ([]{}) 上失败 - 即使它有效,因为你会将 [}。 (start = 1end = 4


作为口头描述,我将执行以下操作:

  • 创建第二个预期值字符串。 (稍后解释)
  • 在找到左括号时迭代给定字符串以构建您的期望字符串 - 每当找到右括号时进行比较。

示例:给定的字符串是{([])]

for i in range(0, length):
  • IF 左括号 [{( 将预期的右括号放在预期字符串的末尾。即],})
  • ELSE(:= 如果是右括号):
    • 右括号匹配expactation-string中的LAST CHARACTER? -> 从期望字符串中删除,继续。
    • 右括号与期望字符串中的最后一个字符不匹配? -> 无效格式
    • 期望字符串为空? -> 无效格式
    • 输入字符串已结束,期望字符串不为空? -> 格式无效。

这将像这样处理给定的字符串:

i  | found value  | e-string before| e-string after | remark
0  | {            |                | }              | added }
1  | (            | }              | })             | added ) 
2  | [            | })             | })]            | added ]
3  | ]            | })]            | })             | last element was ] -> removed
4  | )            | })             | }              | last element was ) -> removed
5  | ]            | }              | }              | found ] but expected } -> invalid.

编辑:由于预期的“存储复杂性”也是Oh(n)(不包括输入参数),因此当给定字符串具有n 左括号时,您将遇到Oh(n) 的存储复杂性 - 否问题。但是你。然后应该使用第二个string,因为列表有开销。

对于运行时复杂度:

  • 在某个字符串位置设置值是原子的 -> Oh(1)意思是常量
  • if() 语句是原子的 -> Oh(1)意思是常量
  • 删除字符是原子的 -> Oh(1)意思是常量
  • 你的 for 循环有 Oh(n)(取决于 n)

总结一下,你会得到Oh(n)


如果您想在 Python 中实现这一点,您可以使用http://dog-net.org/string.php 来验证您的“步骤”。 :-)


ps.:我不是故意提供复制和粘贴解决方案! :P

【讨论】:

  • 这个解决方案是一个。快,B。高效,c.正确。
  • 算法不错,解释清楚。
  • 事实上,我非常喜欢它,所以我决定自己编写代码。 :)
猜你喜欢
  • 1970-01-01
  • 2017-06-08
  • 2021-05-20
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多