@@ -45,13 +45,140 @@ Note that 'bcb' is counted only once, even though it occurs twice.
45
45
### ** Python3**
46
46
47
47
``` python
48
-
48
+ class Solution :
49
+ def countPalindromicSubsequences (self , s : str ) -> int :
50
+ mod = 10 ** 9 + 7
51
+ n = len (s)
52
+ dp = [[[0 ] * 4 for _ in range (n)] for _ in range (n)]
53
+ for i, c in enumerate (s):
54
+ dp[i][i][ord (c) - ord (' a' )] = 1
55
+ for l in range (2 , n + 1 ):
56
+ for i in range (n - l + 1 ):
57
+ j = i + l - 1
58
+ for c in ' abcd' :
59
+ k = ord (c) - ord (' a' )
60
+ if s[i] == s[j] == c:
61
+ dp[i][j][k] = 2 + sum (dp[i + 1 ][j - 1 ])
62
+ elif s[i] == c:
63
+ dp[i][j][k] = dp[i][j - 1 ][k]
64
+ elif s[j] == c:
65
+ dp[i][j][k] = dp[i + 1 ][j][k]
66
+ else :
67
+ dp[i][j][k] = dp[i + 1 ][j - 1 ][k]
68
+ return sum (dp[0 ][- 1 ]) % mod
49
69
```
50
70
51
71
### ** Java**
52
72
53
73
``` java
74
+ class Solution {
75
+ private final int MOD = (int ) 1e9 + 7 ;
76
+
77
+ public int countPalindromicSubsequences (String s ) {
78
+ int n = s. length();
79
+ long [][][] dp = new long [n][n][4 ];
80
+ for (int i = 0 ; i < n; ++ i) {
81
+ dp[i][i][s. charAt(i) - ' a' ] = 1 ;
82
+ }
83
+ for (int l = 2 ; l <= n; ++ l) {
84
+ for (int i = 0 ; i + l <= n; ++ i) {
85
+ int j = i + l - 1 ;
86
+ for (char c = ' a' ; c <= ' d' ; ++ c) {
87
+ int k = c - ' a' ;
88
+ if (s. charAt(i) == c && s. charAt(j) == c) {
89
+ dp[i][j][k] = 2 + dp[i + 1 ][j - 1 ][0 ] + dp[i + 1 ][j - 1 ][1 ] + dp[i + 1 ][j - 1 ][2 ] + dp[i + 1 ][j - 1 ][3 ];
90
+ dp[i][j][k] %= MOD ;
91
+ } else if (s. charAt(i) == c) {
92
+ dp[i][j][k] = dp[i][j - 1 ][k];
93
+ } else if (s. charAt(j) == c) {
94
+ dp[i][j][k] = dp[i + 1 ][j][k];
95
+ } else {
96
+ dp[i][j][k] = dp[i + 1 ][j - 1 ][k];
97
+ }
98
+ }
99
+ }
100
+ }
101
+ long ans = 0 ;
102
+ for (int k = 0 ; k < 4 ; ++ k) {
103
+ ans += dp[0 ][n - 1 ][k];
104
+ }
105
+ return (int ) (ans % MOD );
106
+ }
107
+ }
108
+ ```
109
+
110
+ ### ** C++**
111
+
112
+ ``` cpp
113
+ using ll = long long ;
114
+
115
+ class Solution {
116
+ public:
117
+ int countPalindromicSubsequences(string s) {
118
+ int mod = 1e9 + 7;
119
+ int n = s.size();
120
+ vector<vector<vector<ll >>> dp(n, vector<vector<ll >>(n, vector<ll >(4)));
121
+ for (int i = 0; i < n; ++i) dp[ i] [ i ] [ s[ i] - 'a'] = 1;
122
+ for (int l = 2; l <= n; ++l)
123
+ {
124
+ for (int i = 0; i + l <= n; ++i)
125
+ {
126
+ int j = i + l - 1;
127
+ for (char c = 'a'; c <= 'd'; ++c)
128
+ {
129
+ int k = c - 'a';
130
+ if (s[ i] == c && s[ j] == c) dp[ i] [ j ] [ k] = 2 + accumulate(dp[ i + 1] [ j - 1 ] .begin(), dp[ i + 1] [ j - 1 ] .end(), 0ll) % mod;
131
+ else if (s[ i] == c) dp[ i] [ j ] [ k] = dp[ i] [ j - 1 ] [ k] ;
132
+ else if (s[ j] == c) dp[ i] [ j ] [ k] = dp[ i + 1] [ j ] [ k] ;
133
+ else dp[ i] [ j ] [ k] = dp[ i + 1] [ j - 1 ] [ k] ;
134
+ }
135
+ }
136
+ }
137
+ ll ans = accumulate(dp[ 0] [ n - 1 ] .begin(), dp[ 0] [ n - 1 ] .end(), 0ll);
138
+ return (int) (ans % mod);
139
+ }
140
+ };
141
+ ```
54
142
143
+ ### **Go**
144
+
145
+ ```go
146
+ func countPalindromicSubsequences(s string) int {
147
+ mod := int(1e9) + 7
148
+ n := len(s)
149
+ dp := make([][][]int, n)
150
+ for i := range dp {
151
+ dp[i] = make([][]int, n)
152
+ for j := range dp[i] {
153
+ dp[i][j] = make([]int, 4)
154
+ }
155
+ }
156
+ for i, c := range s {
157
+ dp[i][i][c-'a'] = 1
158
+ }
159
+ for l := 2; l <= n; l++ {
160
+ for i := 0; i+l <= n; i++ {
161
+ j := i + l - 1
162
+ for _, c := range [4]byte{'a', 'b', 'c', 'd'} {
163
+ k := int(c - 'a')
164
+ if s[i] == c && s[j] == c {
165
+ dp[i][j][k] = 2 + (dp[i+1][j-1][0]+dp[i+1][j-1][1]+dp[i+1][j-1][2]+dp[i+1][j-1][3])%mod
166
+ } else if s[i] == c {
167
+ dp[i][j][k] = dp[i][j-1][k]
168
+ } else if s[j] == c {
169
+ dp[i][j][k] = dp[i+1][j][k]
170
+ } else {
171
+ dp[i][j][k] = dp[i+1][j-1][k]
172
+ }
173
+ }
174
+ }
175
+ }
176
+ ans := 0
177
+ for _, v := range dp[0][n-1] {
178
+ ans += v
179
+ }
180
+ return ans % mod
181
+ }
55
182
```
56
183
57
184
### ** ...**
0 commit comments