OR170. 回文数索引
描述
给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。输入描述
第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。输出描述
如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如:示例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; }