Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?
, the longest symmetric sub-string is s PAT&TAP s
, hence you must output 11
.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
最初的思路是:用栈 最顶端的字符或者次最顶端的字符 和即将进栈的字符相等的话 就pop 然后长度相应增加。但是有问题,如:pattappattap ,这样做得到的是6,但实际应该是12。
然后用字符串下标的方式来做 不再把相等过的去掉 ,但是还有问题,处理不了 全是一个字符的情况 比如“ppp”、“pppp”;
这是“ppp”的情况 ,做了修改后能处理了 ,但是又处理不了“pppp”
代码如示:
#include <string>
#include <iostream>
using namespace std;
int main()
{
freopen("in.txt", "r", stdin);
string s;
int tempLen = 0, maxLen = 0;
getline(cin, s);
int len = s.length(), i = 1;
if (len == 1 || len == 0 || s.empty() == true)
{
cout << "1" << endl;
return 0;
}
else if (len == 2)
{
if (s[0] == s[1])
{
cout << 2 << endl;
}
else
{
cout << 0 << endl;
}
return 0;
}
for (i = 2; i < len; i++)
{
bool odd_flag = false;
bool begin = false;
tempLen = 0;
int left = i - 1, right = i;
while (left >= 0 && right < len)
{
if (s[left] == s[right])
{
if (s[left]==s[right]&&s[right]==s[left-1])
{
tempLen += 1;
left--;
}
tempLen+=2;
left--;
right++;
begin = true;
}
else if (begin == false)
{
if (s[right] == s[left - 1])
{
tempLen+=1;
tempLen += 2;
left--;
left--;
right++;
begin = true;
odd_flag = true;
}
else
{
break;
}
}
else
{
break;
}
}
/*if (odd_flag)
{
tempLen = 2 * tempLen + 1;
}
else
{
tempLen = 2 * tempLen;
}*/
maxLen = maxLen > tempLen ? maxLen : tempLen;
}
cout << maxLen;
fclose(stdin);
return 0;
/*while (i < len)
{
tempLen = 0;
bool odd_flag = false;
bool begin = false;
while (!sta.empty() && i < len)
{
if (s[i] == sta.top())
{
tempLen++;
begin = true;
i++;
}
else if (sta.size() > 1)
{
char c = sta.top();
sta.pop();
if (s[i] == sta.top())
{
tempLen++;
odd_flag = true;
begin = true;
sta.pop();
i++;
}
else
{
sta.push(c);
sta.push(s[i]);
i++;
if (begin == true)
{
break;
}
}
}
else
{
sta.push(s[i]);
i++;
if (begin == true)
{
break;
}
}
}
if (i < len)
{
sta.push(s[i]);
}
if (odd_flag)
{
tempLen = 2 * tempLen + 1;
}
else
{
tempLen = 2 * tempLen;
}
if (tempLen > maxLen)
{
maxLen = tempLen;
}
}*/
/*for (int i = 2; i < s.length(); i++)
{
auto it = ans.end();
tempLen = 0;
while (s[i]==(*it))
{
ans.erase(it);
tempLen++;
i++;
it--;
}
it = ans.end();
if (s[i]==ans[ans.length()-2])
{
ans.erase(ans.end());
ans.erase(ans.end());
tempLen++;
}
}*/
}
之前没修改 只是不能处理“ppp”时的代码 只有一个测试点不过
柳婼代码:
#include <iostream>
using namespace std;
int dp[1010][1010];
int main() {
string s;
getline(cin, s);
int len = s.length(), ans = 1;
for(int i = 0; i < len; i++) {
dp[i][i] = 1;
if(i < len - 1 && s[i] == s[i+1]) {
dp[i][i+1] = 1;
ans = 2;
}
}
for(int L = 3; L <= len; L++) {
for(int i = 0; i + L - 1 < len; i++) {
int j = i + L -1;
if(s[i] == s[j] && dp[i+1][j-1] == 1) {
dp[i][j] = 1;
ans = L;
}
}
}
printf("%d", ans);
return 0;
}
最后又改了解决了“ppp”和“pppp”问题,几个自己想的测试例子:“ppp”、“pppp”、“pattappattap”、“Is PAT&TAP symmetric?”、“ 空字符串”都答案对了 但还有一个测试点不过:
#include <string>
#include <iostream>
using namespace std;
int main()
{
//freopen("in.txt", "r", stdin);
string s;
int tempLen = 0, maxLen = 0;
getline(cin, s);
if (s.empty() == true)
{
cout << 1 << endl;
return 0;
}
int len = s.length(), i = 1;
if (len == 1)
{
cout << len << endl;
return 0;
}
else if (len == 2)
{
if (s[0] == s[1])
{
cout << len << endl;
}
else
{
cout << 0 << endl;
}
return 0;
}
for (i = 2; i < len; i++)
{
bool odd_flag = false;
bool begin = false;
bool quan = false;
tempLen = 0;
int left = i - 1, right = i;
while (left >= 0 && right < len)
{
if (s[left] == s[right])
{
tempLen += 2;
int tempLeft = left, tempRight = right;
while (++tempRight < len&&begin == false)
{
if (s[tempRight] == s[left])
{
tempLen++;
quan = true;
}
else
{
break;
}
}
while (--tempLeft >= 0 && begin == false)
{
if (s[right] == s[tempLeft])
{
tempLen++;
quan = true;
}
else
{
break;
}
}
left--;
right++;
if (quan)
{
break;
}
/*if (s[left]==s[right]&&s[right]==s[left-1])
{
tempLen += 1;
left--;
}*/
begin = true;
}
else if (begin == false)
{
if (s[right] == s[left - 1])
{
tempLen += 1;
tempLen += 2;
left--;
left--;
right++;
begin = true;
odd_flag = true;
}
else
{
break;
}
}
else
{
break;
}
}
/*if (odd_flag)
{
tempLen = 2 * tempLen + 1;
}
else
{
tempLen = 2 * tempLen;
}*/
maxLen = maxLen > tempLen ? maxLen : tempLen;
}
cout << maxLen << endl;
//fclose(stdin);
return 0;
/*while (i < len)
{
tempLen = 0;
bool odd_flag = false;
bool begin = false;
while (!sta.empty() && i < len)
{
if (s[i] == sta.top())
{
tempLen++;
begin = true;
i++;
}
else if (sta.size() > 1)
{
char c = sta.top();
sta.pop();
if (s[i] == sta.top())
{
tempLen++;
odd_flag = true;
begin = true;
sta.pop();
i++;
}
else
{
sta.push(c);
sta.push(s[i]);
i++;
if (begin == true)
{
break;
}
}
}
else
{
sta.push(s[i]);
i++;
if (begin == true)
{
break;
}
}
}
if (i < len)
{
sta.push(s[i]);
}
if (odd_flag)
{
tempLen = 2 * tempLen + 1;
}
else
{
tempLen = 2 * tempLen;
}
if (tempLen > maxLen)
{
maxLen = tempLen;
}
}*/
/*for (int i = 2; i < s.length(); i++)
{
auto it = ans.end();
tempLen = 0;
while (s[i]==(*it))
{
ans.erase(it);
tempLen++;
i++;
it--;
}
it = ans.end();
if (s[i]==ans[ans.length()-2])
{
ans.erase(ans.end());
ans.erase(ans.end());
tempLen++;
}
}*/
}