class Solution {
public boolean isMatch(String s, String p){
int m = s.length();
int n = p.length();
boolean[][] f = new boolean[m + 1][n + 1];
f[0][0]=true;for(int i =0; i <= m; ++i){for(int j =1; j <= n; ++j){if(p.charAt(j - 1)=='*'){
f[i][j]= f[i][j - 2];if(matches(s, p, i, j - 1)){
f[i][j]= f[i][j]|| f[i - 1][j];}}else{if(matches(s, p, i, j)){
f[i][j]= f[i - 1][j - 1];}}}}return f[m][n];}
public boolean matches(String s, String p, int i, int j){if(i ==0){returnfalse;}if(p.charAt(j - 1)=='.'){returntrue;}return s.charAt(i - 1)== p.charAt(j - 1);}}
class Solution {
public int nthUglyNumber(int n){
int[] factors ={2, 3, 5};
Set<Long> seen = new HashSet<Long>();
PriorityQueue<Long> heap = new PriorityQueue<Long>();
seen.add(1L);
heap.offer(1L);
int ugly =0;for(int i =0; i < n; i++){
long curr = heap.poll();
ugly =(int) curr;for(int factor : factors){
long next = curr * factor;if(seen.add(next)){
heap.offer(next);}}}return ugly;}}
class Solution {
public double[] dicesProbability(int n){
double[] dp = new double[6];
Arrays.fill(dp, 1.0 / 6.0);for(int i =2; i <= n; i++){
double[] tmp = new double[5 * i + 1];for(int j =0; j < dp.length; j++){for(int k =0; k <6; k++){
tmp[j + k]+= dp[j] / 6.0;}}
dp = tmp;}return dp;}}