我对这个简单的黑客问题一直有疑问。我的代码在编译器中工作,但hackerrank测试失败了6个测试用例。其中一个我的输出是正确的(我没有支付额外费用)。这里有什么问题吗?
提示: 史蒂夫在ascii ['a'..'z']范围内有一串小写字符。他希望通过一系列操作将字符串缩减到最短的长度,在这些操作中,他选择一对相邻的小写字母匹配,然后删除它们。例如,字符串aab可以在一次操作中缩短为b。
Steve的任务是使用此方法删除尽可能多的字符并打印生成的字符串。如果最终字符串为空,请打印空字符串
实施例
aaabccddd→abccddd→abddd→abd
baab→bb→空字符串
这是我的代码:
def super_reduced_string(s):
count_dict = {}
for i in s:
if (i in count_dict.keys()):
count_dict[i] += 1
else:
count_dict[i] = 1
new_string = ''
for char in count_dict.keys():
if (count_dict[char] % 2 == 1):
new_string += char
if (new_string is ''):
return 'Empty String'
else:
return new_string
以下是输出无效的示例。
print(super_reduced_string('abab'))
它输出'Empty String'
但应输出'abab'
。
答案 0 :(得分:1)
通过使用计数器,您的程序将丢失其查看字符的顺序。例如,输入'abab'
,程序会看到两个 a 和两个 b ,并删除它们,即使它们不相邻。然后输出'Empty String'
,但应输出'abab'
。
此问题相当于找到不匹配的括号,但开头字符是其自己的结束字符。
这意味着可以使用堆栈在单次遍历中解决它。
由于Python可以返回一个实际的空字符串,因此如果给出'Empty String'
之类的输入,我们将输出而不是'EEEmpty String'
,这可能是不明确的。
def super_reduced_string(s):
stack = []
for c in s:
if stack and c == stack[-1]:
stack.pop()
else:
stack.append(c)
return ''.join(stack)
print(super_reduced_string('aaabab')) # 'abab'
print(super_reduced_string('aabab')) # 'bab'
print(super_reduced_string('abab')) # 'abab'
print(super_reduced_string('aaabccddd ')) # 'abd'
print(super_reduced_string('baab ')) # ''
答案 1 :(得分:0)
我通过递归解决了它:
def superReducedString(s):
if not s:
return "Empty String"
for i in range(0,len(s)):
if i < len(s)-1:
if s[i] == s[i+1]:
return superReducedString(s[:i]+s[i+2:])
return s
此代码循环遍历字符串,并检查字符串中的当前字母和下一个字母/位置是否相同。如果是这样,我将从字符串中切出这两个字母/位置,并将新创建的精简字符串传递给函数。 直到字符串中没有对为止。
测试:
print(super_reduced_string('aaabccddd')) # 'abd'
print(super_reduced_string('aa')) # 'Empty String'
print(super_reduced_string('baab')) # 'Empty String'
答案 2 :(得分:0)
我通过创建一个列表来解决它,然后仅添加唯一字母并删除在主字符串上找到的最后一个字母。最终所有测试都通过了!
def superReducedString(self, s):
stack = []
for i in range(len(s)):
if len(stack) == 0 or s[i] != stack[-1]:
stack.append(s[i])
else:
stack.pop()
return 'Empty String' if len(stack) == 0 else ''.join(stack)