Существующий код не работает для палиндромов нечетной длины из-за
for(int i = 0; i < sizeof(booleans)/sizeof(booleans[0])-1; i++)
Либо используйте i<=sizeof(booleans)/sizeof(booleans[0])-1;
или i<sizeof(booleans)/sizeof(booleans[0]);
.
В настоящее время вы не считая сравнения character[middle-1]
и character[middle+1]
.
Для палиндромов четной длины вам придется немного изменить логи c, потому что палиндромы четной длины не имеют определенной средней точки.
#include <iostream>
#include <cstring>
using namespace std;
int main(){
//take input
string input;
cout << "Enter your word: ";
cin >> input;
//initialize arrays and variables
int counter = 0, k = 0;
int char_length = input.length();
char characters[char_length];
strcpy(characters, input.c_str());//copy the string into char array
//index of character at the midpoint of the character array
int middle = (char_length+1)/2;
int booleans[middle]; //to keep 1's and 0's
//check the characters
int m = 0, n = char_length-1;
while(m<=n){
if(characters[m] == characters[n]){
booleans[k] = 1;
} else {
booleans[k] = 0;
}
k++;
m++;
n--;
}
//count number of 1's (true for being equal) in the booleans array
for(int i = 0; i < sizeof(booleans)/sizeof(booleans[0]); i++){
counter += booleans[i];
}
cout<<counter<<" "<<middle<<endl;
//compare 1's with size of array
if(counter == middle){
cout << input << " is a Palindrome!" << endl;
} else {
cout << input << " is not a Palindrome!" << endl;
}
return 0;
}
Здесь размер логического массива равен (длина + 1) / 2,
Для строки s, такой как abcba
, она будет иметь длину 3.
Это соответствует сравнению a a
, b b
и c c
. Поскольку средний элемент одинаков, условие всегда выполняется для этого случая.
Более того, понятие середины удалено, и указатели просят двигаться, пока они не пересекут друг друга.