题目出自腾讯2017的实习编程第一题。
有问题的点:1. 子字符串如何取出;2. 指针的移动方法;3. 递归或者动态规划;
有意思的点:1. 类似二进制的枚举法;2. string赋值的技巧;3. 不要轻易改动循环变量; 4. 循环体内部的局部变量重置。
尝试用暴力法求解,但因时间复杂过高未能通过样例。
#include <string>
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int isPalindrome(string s)
{
int i = 0, j = s.length()-1;
if (s.length() == 0)
return 0;
while (i < j)
if (s[i++] != s[j--])
return 0;
return s.length();
}
int main()
{
vector<int> result;
string wordIn;
while (cin >> wordIn)
{
int a[1002] = {0};
int max_len = 1;
int len = wordIn.length();
for (int i = 1; i < pow(2, len); i++)
{
int x = i;
for (int j = 0; j < len; j++)
{
a[j] = x%2;
x = x/2;
if (x == 0) break;
}
string temp;
for (int j = 0; j < len; j++)
if (a[j] == 1)
temp += wordIn[j];
if (isPalindrome(temp) > max_len)
max_len = isPalindrome(temp);
}
result.push_back(max_len);
free(a);
}
for (int i = 0; i < result.size(); i++)
cout << result[i] << endl;
return 0;
}