题目描述
给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。
输入描述:
第一行包含T,测试数据的组数。后面跟有T行,每行包含一个字符串。
输出描述:
如果可以删去一个字母使它变成回文串,则输出任意一个满足条件的删去字母的位置(下标从0开始)。例如:
bcc
我们可以删掉位置0的b字符。
示例1
输出
复制3 0 -1
解题思路:用sting类的erase进行解题,注意用一次erase函数str本身就会删除,如果要保存最原始的str,应该将str赋值给copy,操作copy;
erase常用用法:
1. basic_string & erase(size_type pos=0, size_type n=npos);//本题采用的
即从给定起始位置pos
处开始删除, 要删除字符的长度为n
, 返回值修改后的string对象引用
2. iterator erase(const_iterator first, const_iterator last)
删除迭代器[first, last)
区间的所有字符,返回一个指向被删除的最后一个元素的下一个字符的迭代器.
str.erase(str.begin() + 10, str.end());
#include "iostream" #include "cstring" #include "string" #include "algorithm" #include "cmath" #include "set" using namespace std; bool judge(int size,const string &s) { for(int i=0;i<size/2;i++){ if(s[i]!=s[s.size()-1-i]) return true;//需要删除 }return false; } int main() { int size; string str; cin>>size; while(size-->0) { cin>>str; if(judge(str.size(),str)==false) cout<<-1<<endl; else{ int f=0; for(int i=0;i<str.size();i++){ if(f==1) break; string copy=str;//操作copy,操作一次后重新将str赋值给copy string tmp=copy.erase(i,1); for(int j=0;j<str.size()-1;j++){ if(judge(tmp.size(),tmp)==false){ cout<<i<<endl;f=1;break; } } } } } }