复杂回文字符串校验问题:IsPalindrome方法适配优化需求
回文校验方法修改方案
原方法的核心问题是仅跳过空格,未过滤标点符号,导致标点被纳入字符统计,使得奇数次数的字符数量超过1,从而返回错误的false结果。要解决这个问题,只需在遍历字符时,只保留字母字符,自动忽略所有非字母(包括标点、空格等)。
修改后的完整代码
public bool IsPalindrome(PalindromeModel model) { // 检查输入是否为空或仅含空白字符 if (string.IsNullOrWhiteSpace(model.Value)) return false; var inputDict = new Dictionary<char, int>(); var lowerInputStr = model.Value.ToLower(); // 仅统计字母字符,自动跳过标点、空格等非字母内容 for (var i = 0; i < lowerInputStr.Length; i++) { char currentChar = lowerInputStr[i]; if (char.IsLetter(currentChar)) { if (inputDict.ContainsKey(currentChar)) inputDict[currentChar] += 1; else inputDict.Add(currentChar, 1); } } var countOdds = 0; foreach (var elem in inputDict) { if (elem.Value % 2 != 0) countOdds++; } // 回文的核心条件:最多一个字符出现奇数次 return countOdds <= 1; }
修改说明
- 替换了原代码中判断空格的逻辑,改用
char.IsLetter(currentChar)筛选字符,确保只有字母被统计,自动忽略标点、空格、数字等无关字符。 - 保留原有的大小写不敏感处理(转小写),以及回文判断的核心逻辑(奇数次数字符≤1)不变。
测试Mr. Owl Ate My Metal Worm时,会自动过滤掉.和空格,仅统计字母的出现次数,最终满足回文条件返回true。
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

