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

Posted

技术标签:

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

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

    将多个字符串作为输入

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

    返回要改变的最小字符数,以使两个子字符串成为彼此的字谜(如果不可能,则必须返回 -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)

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

【问题讨论】:

【参考方案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': 2right_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) 以获得所需格式的输出。

【讨论】:

没错!我真的很感谢你的帮助!耐心清晰且解释清楚的解决方案,这在 *** 上非常罕见: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]

【讨论】:

以上是关于如何找出字符串的两个相等部分是不是是python中的字谜的主要内容,如果未能解决你的问题,请参考以下文章

java中如何比较两个数组确定是不是相等?

python - 如何在python中使用IF语句检查两个列表的元素是不是相等?

python找出一个正序反序都相等的数字(例如28682)

判断一个字符是不是相等,该如何表达

检查两个 Python 函数是不是相等

判断两个数组是不是相等