#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
int countSubstrings(char *s) {
int n = strlen(s);
int count = 0;
bool *dp = calloc(n * n, sizeof(bool)); // dp[i * n + j]: s[i..j] is a palindrome
for (int i = 0; i < n; i++) {
dp[i * n + i] = true;
count++;
}
for (int len = 2; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
if (s[i] == s[j] && (len == 2 || dp[(i + 1) * n + (j - 1)])) {
dp[i * n + j] = true;
count++;
}
}
}
free(dp);
return count;
}
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
int countSubstrings(string s) {
int n = s.size();
int count = 0;
vector<vector<bool>> dp(n, vector<bool>(n, false));
for (int i = 0; i < n; i++) {
dp[i][i] = true;
count++;
}
for (int len = 2; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
if (s[i] == s[j] && (len == 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
count++;
}
}
}
return count;
}
};
package dp
func countSubstrings(s string) int {
n := len(s)
count := 0
dp := make([][]bool, n)
for i := range dp {
dp[i] = make([]bool, n)
}
for i := 0; i < n; i++ {
dp[i][i] = true
count++
}
for length := 2; length <= n; length++ {
for i := 0; i+length-1 < n; i++ {
j := i + length - 1
if s[i] == s[j] && (length == 2 || dp[i+1][j-1]) {
dp[i][j] = true
count++
}
}
}
return count
}
class Solution {
public int countSubstrings(String s) {
int n = s.length();
int count = 0;
boolean[][] dp = new boolean[n][n];
for (int i = 0; i < n; i++) {
dp[i][i] = true;
count++;
}
for (int len = 2; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j) && (len == 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
count++;
}
}
}
return count;
}
}
/**
* @param {string} s
* @return {number}
*/
var countSubstrings = function (s) {
const n = s.length;
let count = 0;
const dp = Array.from({ length: n }, () => new Array(n).fill(false));
for (let i = 0; i < n; i++) {
dp[i][i] = true;
count++;
}
for (let len = 2; len <= n; len++) {
for (let i = 0; i + len - 1 < n; i++) {
const j = i + len - 1;
if (s[i] === s[j] && (len === 2 || dp[i + 1][j - 1])) {
dp[i][j] = true;
count++;
}
}
}
return count;
};
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
count = 0
dp = [[False] * n for _ in range(n)]
for i in range(n):
dp[i][i] = True
count += 1
for length in range(2, n + 1):
for i in range(n - length + 1):
j = i + length - 1
if s[i] == s[j] and (length == 2 or dp[i + 1][j - 1]):
dp[i][j] = True
count += 1
return count
impl Solution {
pub fn count_substrings(s: String) -> i32 {
let b = s.as_bytes();
let n = b.len();
let mut count = 0;
let mut dp = vec![vec![false; n]; n];
for i in 0..n {
dp[i][i] = true;
count += 1;
}
for len in 2..=n {
for i in 0..=n - len {
let j = i + len - 1;
if b[i] == b[j] && (len == 2 || dp[i + 1][j - 1]) {
dp[i][j] = true;
count += 1;
}
}
}
count
}
}