判断两个字符串是否互为变形词
判断两个字符串是否互为变形词
【题目】
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词。
请实现函数判断两个字符串是否互为变形词。
是变形词返回True,不是变形词返回False。
【举例】
str1=“123”,str2=“231”,返回True。
str1=“123”,str2=“2331”,返回False。
算法思路
统计字符串str1的种类及数量,再与str2进行对比。
- 比较字符串长度,长度不同,则返回False;
- 统计str1,字符及对应数量递增;
- 对比str2,字符及对应数量递减;
- 对比过程中,发现字符种类不存在或者数量递减至负数,则返回False;
- 对比完成,两者字符串长度相同,又不存在字符种类不同及数量不对齐情况,则说明两者互为变形词,返回True。
若字符串只包含ASCII字符,可创建长度为256的数组统计其数量(索引为字符在ASCII上对应的编码),见is_deformed_ascii_str(s1, s2)
;
若字符串包含广义unicode字符,可创建散列表(python对应实现为字典),存储键值对(字符种类——数量),见is_deformed_str(s1, s2)
。
相应代码
# 判断两个由ASCII字符构成的字符串是否互为变形词
def is_deformed_ascii_str(s1, s2):
if len(s1) == 0 or len(s2) == 0 or len(s1) != len(s2):
return False
arr = [0 for i in range(256)]
for i in range(len(s1)):
arr[ord(s1[i])] += 1
for i in range(len(s2)):
arr[ord(s2[i])] -= 1
if arr[ord(s2[i])] < 0:
return False
return True
# 判断两个字符串是否互为变形词
def is_deformed_str(s1, s2):
if len(s1) == 0 or len(s2) == 0 or len(s1) != len(s2):
return False
d = {} # 字符-次数 字典
for i in range(len(s1)):
d[s1[i]] = d.get(s1[i], 0) + 1
for i in range(len(s2)):
d[s2[i]] = d.get(s2[i], 0) - 1
if d[s2[i]] < 0:
return False
return True
# 简单测试
if __name__ == '__main__':
print(is_deformed_ascii_str('123', '231')) # True
print(is_deformed_ascii_str('123', '2331')) # False
print(is_deformed_ascii_str('1231', '2131')) # True
print(is_deformed_str('123', '231')) # True
print(is_deformed_str('123', '2331')) # False
print(is_deformed_str('1231', '2131')) # True
有任何疑问和建议,欢迎在评论区留言和指正!
感谢您所花费的时间与精力!