1147. 段式回文
https://leetcode-cn.com/problems/longest-chunked-palindrome-decomposition/
public class Solution
{
int result;
string text;
//lastIndex[x][y]表示0-y这段字符串中x字母最后出现的位置
int[][] lastIndex = new int[26][];
void InitData(string _text) {
this.text = _text;
int[] charIndex = new int[26];
for (int i = 0; i < charIndex.Length; i++) {
charIndex[i] = -1;
lastIndex[i] = new int[_text.Length];
}
for (int i = 0; i < text.Length; i++) {
charIndex[text[i] - 'a'] = i;
for (int k = 0; k < 26; k++) {
lastIndex[k][i] = charIndex[k];
}
}
}
bool CheckMatch(int left, int right, int length) {
for (int i = 0; i < length; i++) {
if (text[left + i] != text[right - length + 1 + i]) {
return false;
}
}
return true;
}
bool DfsFind(int depth, int index) {
if (((text.Length - 1) >> 1) < index) {
//index超过一半了
result = depth;
return true;
}
int rightIdx = text.Length - 1 - index;
int[] last = lastIndex[text[index] - 'a'];
int skipIndex = rightIdx;
while (-1 != last[skipIndex]) {
int length = rightIdx - last[skipIndex] + 1;
if (CheckMatch(index, rightIdx, length)) {
int number = 1;
if (index != rightIdx - length + 1) {
number = 2;
}
if (DfsFind(depth + number, index + length)) {
return true;
}
}
if (last[skipIndex] <= 0) {
break;
}
skipIndex = last[last[skipIndex] - 1];
}
return false;
}
public int LongestDecomposition(string _text) {
InitData(_text);
DfsFind(0, 0);
return result;
}
}