# 1638. Count Substrings That Differ by One Character
###### tags: `Leetcode` `Medium` `Greedy` `Three Pass` `Dynamic Programming`
Link: https://leetcode.com/problems/count-substrings-that-differ-by-one-character/description/
## 思路
思考如果我们发现s[i], t[j]不一样 我们应该如何count包含s[i], t[j]的valid substring的个数
我们只需要找到```s[i]```和```t[j]```**之前**有多少个连续的、相等的字符的个数```a```
```s[i]```和```t[j]```**之后**有多少个连续的、相等的字符的个数b
然后对于两个不相同的s[i]和t[j] count就是```(a+1)*(b+1)```
## Code
```python=
class Solution:
def countSubstrings(self, s: str, t: str) -> int:
m, n = len(s), len(t)
front = [[0 for j in range(n+2)] for i in range(m+2)]
end = [[0 for j in range(n+2)] for i in range(m+2)]
for i in range(1, m+1):
for j in range(1, n+1):
if s[i-1]==t[j-1]:
front[i][j] = front[i-1][j-1]+1
for i in range(m, 0, -1):
for j in range(n, 0, -1):
if s[i-1]==t[j-1]:
end[i][j] = end[i+1][j+1]+1
ans = 0
for i in range(1, m+1):
for j in range(1, n+1):
if s[i-1]==t[j-1]: continue
ans += (front[i-1][j-1]+1)*(end[i+1][j+1]+1)
return ans
```
```java=
class Solution {
public int countSubstrings(String s, String t) {
int m = s.length(), n = t.length();
int[][] front = new int[m+2][n+2];
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
if(s.charAt(i-1)==t.charAt(j-1)) front[i][j] = front[i-1][j-1]+1;
}
}
int[][] end = new int[m+2][n+2];
for(int i=m; i>=1; i--){
for(int j=n; j>=1; j--){
if(s.charAt(i-1)==t.charAt(j-1)) end[i][j] = end[i+1][j+1]+1;
}
}
int ans = 0;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
if(s.charAt(i-1)==t.charAt(j-1)) continue;
ans += (front[i-1][j-1]+1)*(end[i+1][j+1]+1);
}
}
return ans;
}
}
```