超级弦乐蟒蛇

时间:2018-06-17 01:25:30

标签: python string

我对这个简单的黑客问题一直有疑问。我的代码在编译器中工作,但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'

3 个答案:

答案 0 :(得分:1)

通过使用计数器,您的程序将丢失其查看字符的顺序。例如,输入'abab',程序会看到两个 a 和两个 b ,并删除它们,即使它们不相邻。然后输出'Empty String',但应输出'abab'

O(n)基于堆栈的解决方案

此问题相当于找到不匹配的括号,但开头字符是其自己的结束字符。

这意味着可以使用堆栈在单次遍历中解决它。

由于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)
相关问题