繁体   English   中英

如何找出字符串的两个相等部分是否是 python 中的字谜

[英]How to find out if the two equal parts of a string are anagrams in python

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

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

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

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

样本输入

6
aaabbb
ab
abc
mnop
xyyx
xaxbbbxx

样品 Output

3
1
-1
2
0
1

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

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

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)

我提前感谢任何帮助。

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

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]

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

在本声明中:

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

Output:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM