2022-2-5 剑指offer day23

题1:

JZ10 斐波那契数列

描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足 fib(x)=\left\{ \begin{array}{rcl} 1 & {x=1,2}\\ fib(x-1)+fib(x-2) &{x>2}\\ \end{array} \right.fib(x)={1fib(x1)+fib(x2)x=1,2x>2 的数列
数据范围:1\leq n\leq 401n40
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n) ,本题也有时间复杂度 O(logn)O(logn) 的解法
 
 

输入描述:

一个正整数n

返回值描述:

输出一个正整数。
 
 1 public class Solution {
 2     public int Fibonacci(int n) {
 3         int f1=1,f2=1;
 4         if (n<=2) return 1;
 5         int ans=0;
 6         for (int i=3;i<=n;i++){
 7             ans=f1+f2;
 8             f1=f2;
 9             f2=ans;
10         }
11         return ans;
12     }
13 }

思路:类似于跳台阶。

题2:

JZ19 正则表达式匹配

描述

请实现一个函数用来匹配包括'.'和'*'的正则表达式。
1.模式中的字符'.'表示任意一个字符
2.模式中的字符'*'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
 
数据范围:
1.str 只包含从 a-z 的小写字母。
2.pattern 只包含从 a-z 的小写字母以及字符 . 和 *,无连续的 '*'。
3. 0 \le str.length \le 26 \0str.length26 
4. 0 \le pattern.length \le 26 \0pattern.length26 

 

 1 import java.util.*;
 2 
 3 
 4 public class Solution {
 5     /**
 6      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 7      *
 8      * 
 9      * @param str string字符串 
10      * @param pattern string字符串 
11      * @return bool布尔型
12      */
13     public boolean match (String str, String pattern) {
14         // write code here
15         int m=str.length(),n=pattern.length();
16         boolean[][] f=new boolean[m+1][n+1];
17         // f[i][j] 长度i str 与 长度 j pattern
18         for (int i=0;i<=m;i++) {
19             for (int j=0;j<=n;j++) {
20                 if (j==0) {
21                     // 匹配串是空串,如果str也是空串则1否则都为0
22                     f[i][j]= i==0;
23                 }else {
24                     if (pattern.charAt(j-1)!='*'){
25                     // 最后一个点或者相等
26                         if (i>0&&(str.charAt(i-1)==pattern.charAt(j-1)||pattern.charAt(j-1)=='.')){
27                             f[i][j]=f[i-1][j-1];
28                         }
29                     }else {
30                     // 不匹配跳过
31                     if (j>=2){
32                         f[i][j]|=f[i][j-2];
33                     }
34                     //匹配的上
35                     if (j>=2&&i>=1&&(pattern.charAt(j-2)==str.charAt(i-1)||pattern.charAt(j-2)=='.')){
36                         f[i][j]|=f[i-1][j];
37                     }
38                     }
39             }
40         }
41         }
42         return f[m][n];
43     }
44 }

思路:动态规划。f[i][j] 长度为i的str与长度为j 的pattren匹配,末尾如果相等或者是点,转化为i-1,j-1.  如果有星号,要么是0个 即 i ,j-2 要么 匹配上 i-1,j.

posted on 2022-03-05 11:05  阿ming  阅读(22)  评论(0编辑  收藏  举报

导航