列表

详情


OR170. 回文数索引

描述

给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。

输入描述

第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。

输出描述

如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如:

bcc

我们可以删掉位置0的b字符。

示例1

输入:

3
aaab
baa
aaa

输出:

3
0
-1

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 236KB, 提交时间: 2019-07-19

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int T,i=0,j,k,m=0,n=0;
    char str[100];
    char str_tmp[100];
    
    scanf("%d",&T);
    memset(str,0,100);
    memset(str_tmp,0,100);
    
    while (i < T) {
        scanf("%s",str);

 //       printf("str=%s\n",str);
        for (m=0;m<strlen(str)/2;m++) {
            if(str[m] != str[strlen(str)-m-1]) {
                break;
            }
         }
 //       printf("%d %d str[m]=%c %c",m,strlen(str_tmp)/2,str[m],str[strlen(str)-m-1]);
        if (m == strlen(str)/2) {
            printf("-1\n");
            i++;
            continue;
        }
        
 //       printf("%s\n",str);
        for (j=0;j<strlen(str);j++) {
            for (k=0,m=0;k<strlen(str);k++) {
                if (k == j) {
                    continue;
                }
                str_tmp[m++] = str[k];
            }
            str_tmp[m]='\0';
 //           printf("%s\n",str_tmp);
            for (n=0;n<strlen(str_tmp)/2;n++) {
  //              printf("%c n=%d %d %c",str_tmp[n],n,strlen(str_tmp)-n,str_tmp[strlen(str_tmp)-n-1]);
                if(str_tmp[n] != str_tmp[strlen(str_tmp)-n-1]) {
                    break;
                }
            }
           
//            printf("%d %d",n,strlen(str_tmp)/2);
            if (n == strlen(str_tmp)/2) {
                printf("%d\n",j);
                memset(str_tmp,0,100);
                break;
            }
            memset(str_tmp,0,100);
        }
 //       printf("i=%d\n",i);
        i++;
    }
}

C++ 解法, 执行用时: 2ms, 内存消耗: 324KB, 提交时间: 2021-09-16

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
bool ispalindrome(string& s,int* start,int* end){
    int i=0;
    int j=s.size()-1;
    bool res=true;
    while(i<=j){
        if(s[i]!=s[j]){
            res=false;
            break;
        }
        i++;j--;
    }
    if(start!=nullptr) *start=i;
    if(end!=nullptr) *end=j;
    return res;
}
int main(){
    int n;
    cin>>n;
    while(n){
        string s;
        cin>>s;
        int start = 0;
        int end = s.size()-1;
        if(ispalindrome(s,&start,&end)){
            cout<<-1<<endl;
        }
        else{
            s.erase(end,1);
            if(ispalindrome(s,nullptr,nullptr)){
                cout<<end<<endl;
            }
            else{
                cout<<start<<endl;
            }
        }
        n--;
    }
    return 0;
}

上一题