回文串最长

链接:https://www.nowcoder.com/questionTerminal/28c1dc06bc9b4afd957b01acdf046e69
来源:牛客网

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

忘记dp怎么写了
假设初始字符串长度为0,逐渐往字符串后加字符。
arr[i]为从字符串str[i]开始到结束最长的回文串长度

#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX(a,b) (a>b?a:b)
#define N 1000+7

int main(){
	string str;
	
	while (cin >> str){
		int arr[N];
		memset(arr, 0, sizeof(arr));
		int len = str.size();
		for (int i = 1; i < len; i++){
		//每添加一个字符,计算一次新字符串里最长的回文串的长度
			for (int j = 0; j < i; j++){
				if (str[i] == str[j]){
				//更新数组
					for (int k = 0; k <= j; k++){
						if (arr[k] < arr[j + 1] + 2)
							arr[k] = arr[j + 1] + 2;
					}
				}
			}
			//从str[i[到str[i]的字符串的最长回文串为自身,长度为1
			arr[i] = 1;
		}
		cout << len - arr[0] << endl;
	}
	return 0;
}

你可能感兴趣的:(字符串)