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(x−1)+fib(x−2)x=1,2x>2 的数列
数据范围:1\leq n\leq 401≤n≤40
要求:空间复杂度 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 \0≤str.length≤26
4. 0 \le pattern.length \le 26 \0≤pattern.length≤26
4. 0 \le pattern.length \le 26 \0≤pattern.length≤26
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.