【一隻蒟蒻的刷題歷程】 【PTA】 A1040 最長對稱字符串

給定一個字符串,您應該輸出最長的對稱子字符串的長度。 例如,給定PAT&TAP對稱嗎?,最長的對稱子字符串是s PAT&TAP,因此您必須輸出11。

輸入規格:

每個輸入文件包含一個測試用例,該用例給出的長度不超過1000的非空字符串。

輸出規格:

對於每個測試用例,只需在一行中打印最大長度即可。

輸入樣例:

PAT&TAP是對稱的嗎?

樣本輸出:

11


思路:

dp[ i ] [ j ]         = dp[ i+1] [ j-1 ] , s[ i ] == s [ j ];
                        = 0 , s[ i ] != s [ j ];

邊界:
dp[ i ] [ i ] =1;
if s [ i ] == s [ j ] ,dp[ i ] [ i + 1 ] =1;


代碼:

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;  
string s;
int ans=1;
int dp[1050][1050]; //i->j是否爲迴文,是1,否0
int main()
{
  getline(cin,s);
  for(int i=0;i<s.length();i++)
  {
  	dp[i][i]=1;  //一個點是迴文 長度1
  	if(i+1<s.length())
  	{
  		if(s[i]==s[i+1]) //相鄰兩個點相等是迴文
  		{
  			dp[i][i+1]=1; //dp=1 是迴文
  			ans=2;  //長度爲2
		}
	}
  }
  
  for(int l=3;l<=s.length();l++) //字符串長度
  {
  	for(int i=0;i+l-1<s.length();i++)
  	 //當前左端 右端,例如l=3,字符串長度爲3,就是string的0-2三個位置
  	{
  		int j=i+l-1; //右端
  		if(s[i]==s[j] && dp[i+1][j-1]==1) 
  		//左右端相等 並且i+1 -> j-1 是迴文串,那麼i->j也是迴文
  		{
  			dp[i][j]=1; //記錄是迴文
  			ans=l;  //更新最長長度
		}
	  }
  }
  cout<<ans;
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章