【问题标题】:How to find out if the two equal parts of a string are anagrams in python如何找出字符串的两个相等部分是否是python中的字谜
【发布时间】:2021-06-14 20:33:58
【问题描述】:

我正在尝试编写执行以下操作的代码:

  1. 将多个字符串作为输入

  2. 将每个字符串分成两个等长的连续子字符串

  3. 返回要改变的最小字符数,以使两个子字符串成为彼此的字谜(如果不可能,则必须返回 -1)。

示例输入

6
aaabbb
ab
abc
mnop
xyyx
xaxbbbxx

样本输出

3
1
-1
2
0
1

有关问题的更详细说明,请查看this 链接(无需登录或注册)。

我已经很好地接近了解决方案,但似乎我没有做对,我的输出通常比预期的要大或小,而且我真的不知道是什么导致了问题。这是我的代码:

n = int(input())
user_input = []

for k in range(n):
    user_input.append(input())

results = []

for i in user_input:
    if len(list(i))%2 == 0:
        left = i[:len(list(i))//2]
        right = i[len(list(i))//2:]

        left_dict = dict((letter,left.count(letter)) for letter in set(left))
        right_dict = dict((letter,right.count(letter)) for letter in set(right))

        if left_dict == right_dict:
            results.append(0)

        else:
            shared_items = {k: left_dict[k] for k in left_dict if k in right_dict and left_dict[k] == right_dict[k]}
            
            results.append(len(left) - len(shared_items))
            

    else:
        results.append(-1)

print(results)

感谢您提前提供的任何帮助。

【问题讨论】:

    标签: python python-3.x list dictionary anagram


    【解决方案1】:

    你一开始就很好,计算了两个子字符串中每个字符的计数,但你从未在技术上使用过这种能力。

    在此声明中:

    shared_items = {k: left_dict[k] for k in left_dict if k in right_dict and left_dict[k] == right_dict[k]}
    

    您只需计算两个字典中的项目并具有相同的计数:

    例如。在您的第 6 个测试用例中:

    xaxbbbxx

    left_dict 将是 {'b': 1, 'a': 1, 'x': 2}
    right_dict 将是 {'b': 2, 'x': 2}

    shared_item你计算的方式会给你:{'x':2}

    但这并没有正确列出所有共享的项目。

    正确的号码。 shared_items 应该是:{'x':2, 'b':1}

    因此,
    然后我们可以做的是计算left_dictright_dict 中常见的物品数量的最小值。
    min(left_dict[k],right_dict[k])

    result.append 语句也会相应改变:

        else:
            shared_items = {k:min(left_dict[k],right_dict[k]) for k in left_dict if k in right_dict}
            
            results.append(len(left)-sum(shared_items.values()))
    

    完全执行:

    n = int(input())
    user_input = []
    
    for k in range(n):
        user_input.append(input())
    
    results = []
    
    for i in user_input:
        if len(list(i))%2 == 0:
            left = i[:len(list(i))//2]
            right = i[len(list(i))//2:]
    
            left_dict = dict((letter,left.count(letter)) for letter in set(left))
            right_dict = dict((letter,right.count(letter)) for letter in set(right))
            if left_dict == right_dict:
                results.append(0)
    
            else:
                shared_items = {k:min(left_dict[k],right_dict[k]) for k in left_dict if k in right_dict}
                
                results.append(len(left)-sum(shared_items.values()))
                
    
        else:
            results.append(-1)
    
    print(results)
    

    输入:

    6
    aaabbb
    ab
    abc
    mnop
    xyyx
    xaxbbbxx
    

    输出:

    [3, 1, -1, 2, 0, 1]
    

    然后您当然可以使用并打印'\n'.join(results) 以获得所需格式的输出。

    【讨论】:

    • 没错!我真的很感谢你的帮助!耐心清晰且解释清楚的解决方案,这在 StackOverflow 上非常罕见:D
    【解决方案2】:

    如果相同字母出现的次数相同,则两个单词是字谜。

    from collections import Counter
    
    sl = ["aaabbb", "ab", "abc", "mnop", "xyyx", "xaxbbbxx"]
    
    
    def f(s):
        if len(s)%2 != 0:
            return -1
    
        a = s[:len(s)//2]
        b = s[len(s)//2:]
    
        print(Counter(b) - Counter(a))
        return sum( (Counter(b) - Counter(a)).values() )
    
    list(map(f, sl))
    
    Counter({'b': 3})
    Counter({'b': 1})
    Counter({'o': 1, 'p': 1})
    Counter()
    Counter({'b': 1})
    
    [3, 1, -1, 2, 0, 1]
    

    【讨论】:

      猜你喜欢
      • 2021-01-11
      • 2019-09-20
      • 2016-04-07
      • 1970-01-01
      • 2016-03-21
      • 2019-03-16
      • 1970-01-01
      • 2015-10-30
      相关资源
      最近更新 更多