代表字符串 的下标 的子串是否为回文串。

O(n^3) 暴力判断

void initPalindromes(int a[][], string s) {
	for(int len = 2; len < s.size(); len++)
		for(int i = 0; i < s.size() - len; i++) {
			for(int j = i + len - 1; j > i; j--)
				if(s[i] != j) {
					a[i][j] = false;
					break;
				}
			a[i][j] = true;
		}
}

O(n^2) 动态规划

初始化:

  • 单字符为回文
  • 时, 为回文

状态转移:

  • 时,为回文

枚举状态要从大到小枚举子串长度,长度为1、2的已经初始化,长度为3的由长度为1的转移,长度为4的由长度为2的转移。

vector<vector<bool>> initPalindromes(string s) {
	int n = s.length();
	vector<vector<bool>> f(n, vector<bool>(n));
 
	for(int i = 0; i < n; i++)
		f[i][i] = true;
	
	for(int i = 0; i < n - 1; ++i)
		if(s[i] == s[i+1])
			f[i][i+1] = true;
	
	for(int len=3; len <= n; ++len) {
		for(int i = 0; i<= n - len; ++i) {
			int j = i + len - 1;
			if(s[j] == s[i] && f[i+1][j-1])
				f[i][j] = true;
		}
	}
 
	return f;
}