提交 2941c6d6 编写于 作者: C chenguangjian.jk

20230719

上级 1241efad
# 正则匹配
给你一个字符串s和一个字符模式p,请你来原生实现一个支持 '.'和'*'的正则表达式匹配。
'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。
# 示例
## 示例 1
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
## 示例 2
输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
## 示例3:
输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
\ No newline at end of file
import java.util.Scanner;
class Main {
public static void main(String[] args) {
// 控制台输入
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String p = scanner.nextLine();
scanner.close();
// 调用方法
boolean res = isMatch(s,p);
// 输出结果
System.out.println(res);
}
/**
*
* @param s
* @param p
* @return
*/
public static 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 static boolean matches(String s, String p, int i, int j) {
if (i == 0) {
return false;
}
if (p.charAt(j - 1) == '.') {
return true;
}
return s.charAt(i - 1) == p.charAt(j - 1);
}
}
/*
1
aa
a
false
2
aa
a*
true
3
ab
.*
true
4
abab
ab
false
5
abcabc
a.*c
true
6
123456
123*
false
7
123456
123.*
true
8
abcdef
a.*e
false
9
abcdef
a.*f
true
10
1234321
1.*1
true
*/
\ No newline at end of file
# 生命进化书
小A有一本生命进化书,以一个树形结构记载了所有生物的演化过程。
为了探索和记录其中的演化规律,小A提出了一种方法,可以以字符串的形式将其复刻下来,规则如下:
初始只有一个根节点,表示演化的起点,依次记录 01 字符串中的字符,
如果记录 0,则在当前节点下添加一个子节点,并将指针指向新添加的子节点;
如果记录 1,则将指针回退到当前节点的父节点处。
现在需要应用上述的记录方法,复刻下它的演化过程。请返回能够复刻演化过程的字符串中, 字典序最小的 01 字符串;
注意:节点指针最终可以停在任何节点上,不一定要回到根节点。
## 输入描述
parents[] 数组,其中,parents[i] 表示编号 i 节点的父节点编号(根节点的父节点为 -1)。
## 输出描述
返回能够复刻演化过程的字符串中, 字典序最小 的 01 字符串
# 示例
## 示例 1:
输入:parents = [-1,0,0,2]
输出:"00110"
解释:共存在 2 种记录方案:
第 1 种方案为:0(记录编号 1 的节点) -> 1(回退至节点 0) -> 0(记录编号 2 的节点) -> 0((记录编号 3 的节点))
第 2 种方案为:0(记录编号 2 的节点) -> 0(记录编号 3 的节点) -> 1(回退至节点 2) -> 1(回退至节点 0) -> 0(记录编号 1 的节点)
返回字典序更小的 "00110"
## 示例 2:
输入:parents = [-1,0,0,1,2,2]
输出:"00101100"
提示:
1 <= parents.length <= 10^4
-1 <= parents[i] < i (即父节点编号小于子节点)
import java.util.Scanner;
import java.util.*;
import java.util.Arrays;
class Main {
static HashMap<Integer, List<Integer>> child = new HashMap<>();
public static void main(String[] args) {
// 控制台输入
Scanner scanner = new Scanner(System.in);
String numsStr = scanner.nextLine();
int[] nums = new int[]{};
// 解析字符串,构造数组
numsStr = numsStr.replaceAll(" ", "");
if (!"[]".equals(numsStr)) {
String[] numsStrArr = numsStr.replaceAll("\\[", "").replaceAll("\\]", "").split("\\,");
nums = new int[numsStrArr.length];
for (int i = 0; i < numsStrArr.length; i++) {
nums[i] = Integer.parseInt(numsStrArr[i].trim());
}
}
scanner.close();
// 调用方法
String res = evolutionaryRecord(nums);
// 输出结果
System.out.println(res);
}
/**
* [-1,0,0,2]
* 00110
*
* [-1,0,0,1,2,2]
* 00101100
*
* @param parents
* @return
*/
public static String evolutionaryRecord(int[] parents) {
int n = parents.length;
if (n == 1) return "";
for (int i = 0; i < n; i++) {
child.put(i, new ArrayList<>());
if (parents[i] == -1) continue;
//子节点
child.get(parents[i]).add(i);
}
StringBuilder sb = new StringBuilder(dfs(0));
int end = 0;
for (int i = sb.length() - 1; i > 0; i--) {
if (sb.charAt(i) != '1') {
end = i;
break;
}
}
return sb.substring(0, end + 1);
}
private static String dfs(int i) {
StringBuilder t = new StringBuilder();
List<String> path = new ArrayList<>();
for (int x : child.get(i)) {
//加入路径
path.add("0" + dfs(x) + "1");
}
//排序
Collections.sort(path);
for (String s : path) {
t.append(s);
}
return t.toString();
}
}
[-1,0,1,1,0,4,5,5,3,2,7,7,8]
\ No newline at end of file
[-1,0,1,1,0,4,5,5,3,2]
\ No newline at end of file
[-1,0,1,1,0,4,5,5,3,2,7]
\ No newline at end of file
[-1,0,1,1,0,4,5,5,3,2,7,7]
\ No newline at end of file
问题1:下列哪一项不是人工智能的主要研究领域?
A. 机器学习
B. 自然语言处理
C. 计算机视觉
D. 数据库管理
答案:D
解答说明:人工智能的主要研究领域包括机器学习、自然语言处理和计算机视觉等,而数据库管理是计算机科学的一个重要分支,但不属于人工智能的主要研究领域。
问题2:下列哪一项不是监督学习的特点?
A. 需要大量标注数据
B. 通过反馈调整模型
C. 无需人工干预
D. 适用于分类和回归问题
答案:C
解答说明:监督学习需要大量标注数据,通过反馈调整模型,适用于分类和回归问题。但是,监督学习需要人工进行数据标注,所以选项C不是监督学习的特点。
问题3:下列哪一项是深度学习的特点?
A. 无法处理大数据
B. 无需特征工程
C. 无法处理非结构化数据
D. 无法处理高维数据
答案:B
解答说明:深度学习的一个重要特点是可以自动从原始数据中学习特征,无需人工进行复杂的特征工程。
问题4:下列哪一项不是强化学习的特点?
A. 通过与环境的交互进行学习
B. 无需预先知道环境的模型
C. 无需反馈信号
D. 适用于序列决策问题
答案:C
解答说明:强化学习的特点包括通过与环境的交互进行学习,无需预先知道环境的模型,适用于序列决策问题。但是,强化学习需要通过反馈信号(奖励或惩罚)来调整策略,所以选项C不是强化学习的特点。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册