如何找出字符串的两个相等部分是不是是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': 2
right_dict
将是 'b': 2, 'x': 2
和shared_item
你计算的方式会给你:'x':2
但这并没有正确列出所有共享的项目。
正确的号码。 shared_items
应该是:'x':2, 'b':1
因此,
然后我们可以做的是计算left_dict
和right_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中的字谜的主要内容,如果未能解决你的问题,请参考以下文章