public class Main {
public static void main
(String[] args
) { System.
out.
println(countPalindromes
(s
)); }
public static int countPalindromes
(String s
) { // i need to Store in a dp[i][j] arr where each cell repr each and every possible subtring..
// Then check validity and store true or false for each substring.
// base case dp[i][i] = length of substring = 1, like declaring base case dp[1]=arr[0] for max subarr
int n = s.length();
boolean[][] dp = new boolean[n][n];
int count = 0;
// Length = 1 (single characters)
for (int i = 0; i < n; i++) {
dp[i][i] = true;
count++;
}
// Length = 2
// condition for length 2 to be true is s[i]==s[i+1]
for (int i = 0; i < n - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
dp[i][i + 1] = true;
count++;
}
}
// Length >= 3
for (int len = 3; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
dp[i][j] = true;
count++;
}
}
}
return count;
}
}
cHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFN0cmluZyBzID0gImFhYSI7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNvdW50UGFsaW5kcm9tZXMocykpOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudFBhbGluZHJvbWVzKFN0cmluZyBzKSB7CiAgICAJLy8gaSBuZWVkIHRvIFN0b3JlIGluIGEgZHBbaV1bal0gYXJyIHdoZXJlIGVhY2ggY2VsbCByZXByIGVhY2ggYW5kIGV2ZXJ5IHBvc3NpYmxlIHN1YnRyaW5nLi4gCiAgICAJLy8gVGhlbiBjaGVjayB2YWxpZGl0eSBhbmQgc3RvcmUgdHJ1ZSBvciBmYWxzZSBmb3IgZWFjaCBzdWJzdHJpbmcuIAogICAgCS8vIGJhc2UgY2FzZSBkcFtpXVtpXSA9IGxlbmd0aCBvZiBzdWJzdHJpbmcgPSAxLCAgbGlrZSBkZWNsYXJpbmcgYmFzZSBjYXNlIGRwWzFdPWFyclswXSBmb3IgbWF4IHN1YmFycgoKICAgICAgICBpbnQgbiA9IHMubGVuZ3RoKCk7CiAgICAgICAgYm9vbGVhbltdW10gZHAgPSBuZXcgYm9vbGVhbltuXVtuXTsKICAgICAgICBpbnQgY291bnQgPSAwOwoKICAgICAgICAvLyBMZW5ndGggPSAxIChzaW5nbGUgY2hhcmFjdGVycykKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBkcFtpXVtpXSA9IHRydWU7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAvLyBMZW5ndGggPSAyCiAgICAgICAgLy8gY29uZGl0aW9uIGZvciBsZW5ndGggMiB0byBiZSB0cnVlIGlzIHNbaV09PXNbaSsxXQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgewogICAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT0gcy5jaGFyQXQoaSArIDEpKSB7CiAgICAgICAgICAgICAgICBkcFtpXVtpICsgMV0gPSB0cnVlOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gTGVuZ3RoID49IDMKICAgICAgICBmb3IgKGludCBsZW4gPSAzOyBsZW4gPD0gbjsgbGVuKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbiAtIGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBpbnQgaiA9IGkgKyBsZW4gLSAxOwoKICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA9PSBzLmNoYXJBdChqKSAmJiBkcFtpICsgMV1baiAtIDFdKSB7CiAgICAgICAgICAgICAgICAgICAgZHBbaV1bal0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBjb3VudDsKICAgIH0KfQ==