C (gcc), 180 168 159 157157 140 bytes
f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;j;p&&i<m;i++)p=s[i]^s[j--,i++)s[i]^s[j]&&(]&&!++p&&(s[i+1]==s[j]&&(p=++i)||s[i]==s[j++p?s[i+1]-1]&&(p=js[j+1]?s[i]-s[j]?p:j-+1)));return*s&&p<0-+2:++i:p;return p<0?m+1:p?p:-1;}
Try it online!Try it online!
22 16 bytes shaved off thanks to ceilingcat! And 3 more bytes since the rules state the minimum length of the input is 2 characters, so don't have to check for empty strings.
f(char *s) { int j = strlen(s), ; // j = length of input int m = j-- / 2, 2; // m = midpoint of string, // j = index of right character int p = -1; // p = -1,position of extra character // p = -1 means no extra character found yet, 0 means invalid input i = 0; // 0 means invalid input int i = 0; // i = index of left character for (; p && i < m; j--, i++) { // loop over the string from both sides, // as long as the input is valid. p = s[i] ^ s[j--] // if (left character != right character && !++p ? // increment i and decrement j. s[i] ^// s[j] && ( and we didn't remove a character yet*) // ifs[i (left+ character1] !=- rights[j character)+ { 1] ? // if (left+1 char != right char) !++p && ( s[i] - s[j] ? // if (we didn'tleft removechar a!= characterright-1 yetchar) { p s[i + 1] == s[j] && ( // // if (left+1 char == rightdo char)nothing, : p = ++i // // else remove left char, j-- + 2 // ) remove right char. || s[i] ==: s[j - 1] && ( // else if (left char == right-1 char) // else ++i p = j-- + 1 // remove left char. remove right char, : ) // else ) p; // }do elsenothing, theor: input is invalid. ); // *the input is marked invalid // } return *s && p < 0 ? // if (non-zeroinput stringvalid and we didn't remove a character yet) m + 1 // return the midpoint character, // : return the midpoint character, : p ? // else p ? // else if (we did remove a character) p // return that character, : // return that character, : -1; // else -1; // else the input was invalid. } ```