参考 这篇csdn博客
dp数组
int[][] dp = new int[s.length][pattern.length]
含义
dp[i][j]
表示从 目标s[0:i +1]
中 序列pattern[0:j +1]
的 出现次数
递推公式
dp[i][j]
= dp[i-1][j] + dp[i-1][j-1]
, 当s[i]==s[j]时
或 dp[i-1][j]
, 当s[i]!=s[j]时
import java.util.*; public class Solution { public int solve (String s) { String pattern = "niuniu"; int idx = 0; int[][] dp = new int[2][pattern.length()+1]; dp[0][0] = 1; dp[1][0] = 1; for(int i = 0; i < s.length(); ++i){ for(int j=1;j<=pattern.length();++j){ dp[idx][j] = (dp[1-idx][j] + (s.charAt(i) == pattern.charAt(j-1) ? dp[1-idx][j-1] : 0)) % (int)(1e9+7); } idx = 1 - idx; } return dp[idx][pattern.length()]; } }