如何修正C++程序以正确判断数组是否为回文或两个回文的拼接?
修正回文数组判断程序的方案
你的原程序逻辑完全偏离了回文的定义,错误地通过统计相等元素对的数量来判断,这才导致了不符合预期的结果。要实现“数组本身是回文,或是两个回文数组的拼接”的判断,我们需要重新梳理逻辑:
核心思路
- 先实现一个正确的单数组回文判断函数:回文的本质是数组对称位置的元素完全相等,比如第i个元素和第
n-1-i个元素必须相等(从0开始计数)。 - 主判断逻辑:
- 先检查整个数组是否是回文,是则直接返回true。
- 如果不是,遍历所有可能的分割点(分割成两个非空数组,所以分割点范围是1到
n-1),对每个分割点,验证左半部分和右半部分是否都为回文,只要有一个分割点满足,就返回true。 - 所有分割点都不满足的话,返回false。
修正后的代码
#include <iostream> using namespace std; // 正确判断单个数组是否为回文的辅助函数 bool isSinglePalindrome(int arr[], int start, int end) { while (start < end) { if (arr[start] != arr[end]) { return false; } start++; end--; } return true; } bool isPalindromeOrTwoPalindromes(int arr[], int n) { // 先判断整个数组是否是回文 if (isSinglePalindrome(arr, 0, n-1)) { return true; } // 遍历所有可能的分割点,分成两个非空数组 for (int split = 1; split < n; split++) { // 左半部分:0到split-1,右半部分:split到n-1 if (isSinglePalindrome(arr, 0, split-1) && isSinglePalindrome(arr, split, n-1)) { return true; } } // 既不是单回文,也不能分割成两个回文 return false; } int main() { // 测试用例1:两个回文拼接的数组,应返回true int arr1[] = {1,2,3,2,1,5,6,7,6,5}; int n1 = sizeof(arr1)/sizeof(arr1[0]); cout << isPalindromeOrTwoPalindromes(arr1, n1) << endl; // 测试用例2:第一部分非回文的数组,应返回false int arr2[] = {1,2,3,3,1,5,6,6,5}; int n2 = sizeof(arr2)/sizeof(arr2[0]); cout << isPalindromeOrTwoPalindromes(arr2, n2) << endl; // 测试用例3:单一回文数组,应返回true int arr3[] = {1,2,3,2,1}; int n3 = sizeof(arr3)/sizeof(arr3[0]); cout << isPalindromeOrTwoPalindromes(arr3, n3) << endl; return 0; }
代码解释
isSinglePalindrome函数:通过双指针从数组两端向中间遍历,逐一比较对称位置的元素,只要有一对不相等就返回false,遍历完成则返回true,这是判断回文的标准实现。isPalindromeOrTwoPalindromes函数:先检查整个数组是否为回文,若不是则尝试所有可能的分割方式,只要存在一种分割能让左右两部分都是回文,就返回true。- 主函数里的三个测试用例分别验证了你的问题场景和正常回文场景,运行结果会依次输出1、0、1,符合预期。
内容的提问来源于stack exchange,提问作者rsm
相关产品推荐
相关产品推荐

