Ruby技术求助:移除1或2个字符生成至少3位回文的方法实现
问题解决方案
题目回顾
给定仅含字母的字符串,编写方法判断能否通过移除1或2个字符生成长度至少为3的回文。若可以,输出移除的字母;若不行,输出"not possible"。
代码实现
# 辅助函数:判断字符串是否为长度≥3的回文 def valid_palindrome?(s) s.length >= 3 && s == s.reverse end def palindrome_checker(str) original_chars = str.chars original_length = original_chars.length # 尝试移除1个字符的场景 (0...original_length).each do |i| modified = original_chars.dup removed_char = modified.delete_at(i) if valid_palindrome?(modified.join) puts "Removed '#{removed_char}' to form palindrome" return end end # 尝试移除2个字符的场景(遍历所有不重复的位置组合) (0...original_length).each do |i| (i+1...original_length).each do |j| modified = original_chars.dup # 先删索引大的,避免删除i后j的索引偏移 removed_j = modified.delete_at(j) removed_i = modified.delete_at(i) if valid_palindrome?(modified.join) puts "Removed '#{removed_i}' and '#{removed_j}' to form palindrome" return end end end # 所有尝试均不满足条件 puts "not possible" end # 测试示例 palindrome_checker("abcecbae") # 输出 Removed 'e' and 'e' to form palindrome palindrome_checker("abcde") # 输出 not possible palindrome_checker("abca") # 输出 Removed 'b' to form palindrome
关键逻辑说明
- 辅助函数
valid_palindrome?:统一回文判断标准,确保后续检查的字符串长度达标且符合回文定义,避免重复逻辑。 - 单字符移除遍历:逐个删除字符串中每个位置的字符,检查修改后的字符串是否符合要求,找到符合条件的立即输出返回,减少不必要的遍历。
- 双字符移除遍历:通过双重循环遍历所有不重复的位置组合(
i < j),先删除索引较大的字符,防止删除前一个字符后导致后一个字符的索引偏移,保证删除位置的准确性。 - 终止逻辑:只要找到符合条件的移除方案就立即终止程序,优化执行效率。
原代码问题修正
- 第一个代码混淆了字符与索引的概念,循环条件错误,且未完成核心判断逻辑。
- 第二个代码仅处理了单字符移除场景,且错误收集了所有尝试删除的字符,无法准确定位到符合要求的移除字符。
内容的提问来源于stack exchange,提问作者PaulineTW
相关产品推荐
相关产品推荐

