Python如何统计字符串中空格与特殊符号 实现正确的变位词判断
问题原因
你的现有代码存在三个核心问题:
str.lower()是返回新字符串的方法,原代码没有把转换结果赋值给变量,大小写转换逻辑完全不生效- 没有过滤输入字符串中的空格、特殊符号,这类无效字符被纳入了统计
- 还未做预处理就判断两个字符串的长度,带空格的变位词会被直接提前返回False
另外原有字符统计逻辑也存在隐性问题:首次出现的字符会被计数为0,只是因为两个字符串的统计逻辑完全一致才没有在简单测试中暴露问题。
修正方案
先对两个输入字符串做统一预处理:仅保留字母字符,全部转为小写,再基于预处理后的结果做长度判断和字符统计即可。这里用Python内置的str.isalpha()方法判断字符是否为字母,自动过滤空格、感叹号、问号等所有非字母内容,无需手动匹配特殊符号。
修正后代码
def is_anagram(string_a, string_b): # 字符串预处理:仅保留字母,统一转为小写 def preprocess(input_str): return ''.join([char.lower() for char in input_str if char.isalpha()]) processed_a = preprocess(string_a) processed_b = preprocess(string_b) # 预处理后长度不一致直接判定为非变位词 if len(processed_a) != len(processed_b): return False char_count_a = dict() char_count_b = dict() for i in range(len(processed_a)): # 统计第一个字符串的字符频次 if processed_a[i] not in char_count_a: char_count_a[processed_a[i]] = 1 else: char_count_a[processed_a[i]] += 1 # 统计第二个字符串的字符频次 if processed_b[i] not in char_count_b: char_count_b[processed_b[i]] = 1 else: char_count_b[processed_b[i]] += 1 return char_count_a == char_count_b
测试结果
- 调用
is_anagram('scar', 'cars')返回True,符合预期 - 调用
is_anagram('Tom Marvolo Riddle', 'I am Lord Voldemort')返回True,符合预期 - 带特殊符号的测试用例
is_anagram('a!b?c', 'c b a')也会返回True
内容的提问来源于stack exchange,提问作者Andrew Reynolds
相关产品推荐
相关产品推荐

