回文数索引(string类erase解题)

题目描述

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

输入描述:

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

输出描述:

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

bcc

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

输入

复制
3
aaab
baa
aaa

输出

复制
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;
            }
        }
    }
    
    
    
}

} 

}

 

  

posted @ 2019-07-20 14:29  浅滩浅  阅读(174)  评论(0编辑  收藏  举报