题目链接:http://codeforces.com/problemset/problem/505/A
题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母,使得新得到的字符串成为回文串。
/**************************************(又到自我反省时刻)
做的时候,通过添加一个单位使得长度增加1,找出中点,检验前一半的位置,找出对称位置替换成对应的前一半位置的字符,然后原字符串剩下的部分追加到后面,再判断回文。但是由于求对称点老是出问题,终于败下阵来了 !_! 。。。。
不是非一般复杂啊啊啊!!
***************************************/
题解说,由于长度很短,可以一个一个位置尝试,每个位置又一个一个字母填入,判断是否回文。对string 还是很生疏啦。
一个一个试是这个意思:
例如 dog,先是adog, bdog, ..., zdog; 接着是daog, dbog, ..., dzog; 直到doga, ..., dogz 结束。
然后就是谈谈string substr 这个函数了
假如 string s = "12345asdf";
那么 s.substr(0, 5) 答案是 12345。// 就是从下标 0 开始,将长度为5的子串选中,所以就是12345了
更详细的用法,可参考这个链接:
http://www.cplusplus.com/reference/string/string/substr/
那么代码中的 s.substr(0, i) 和 s.substr(i) 一起用,就构成原字符串了,这个是字母的插入
string(1, j)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 using namespace std; 6 7 int main() 8 { 9 #ifndef ONLINE_JUDGE 10 freopen("in.txt", "r", stdin); 11 #endif // ONLINE_JUDGE 12 13 string s; 14 while (cin >> s) { 15 bool flag = false; 16 for (int i = 0; i < s.size()+1 && !flag; i++) { 17 for (int j = 'a'; j < 'z'+1 && !flag; j++) { 18 string t = s.substr(0, i) + string(1, j) + s.substr(i); 19 string u = t; 20 reverse(u.begin(), u.end()); // 回文串巧妙处理 21 if (t == u) { 22 flag = true; 23 cout << t << endl; 24 break; 25 } 26 } 27 } 28 if (!flag) 29 cout << "NA" << endl; 30 } 31 }
来源:https://www.cnblogs.com/windysai/p/4254558.html