一、leetcode题目
1.寻找图中是否存在路径
题目描述
有一个具有 n
个顶点的 双向 图,其中每个顶点标记从 0
到 n - 1
(包含 0
和 n - 1
)。图中的边用一个二维整数数组 edges
表示,其中 edges[i] = [ui, vi]
表示顶点 ui
和顶点 vi
之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。
请你确定是否存在从顶点 source
开始,到顶点 destination
结束的 有效路径 。
给你数组 edges
和整数 n
、source
和 destination
,如果从 source
到 destination
存在 有效路径 ,则返回 true
,否则返回 false
。
2.测试用例
输入:
n = 3, edges = [[0,1],[1,2],[2,0]], source = 0, destination = 2
输出:
true
解释:
存在由顶点 0 到顶点 2 的路径:
0 → 1 → 2
0 → 2
提示
- 1 < = n < = 2 ∗ 1 0 5 1 <= n <= 2 * 10^5 1<=n<=2∗105
- 0 < = e d g e s . l e n g t h < = 2 ∗ 1 0 5 0 <= edges.length <= 2 * 10^5 0<=edges.length<=2∗105
- e d g e s [ i ] . l e n g t h = = 2 edges[i].length == 2 edges[i].length==2
- 0 < = u i , v i < = n − 1 0 <= u_i, v_i <= n - 1 0<=ui,vi<=n−1
- u i ! = v i u_i != v_i ui!=vi
- 0 < = s o u r c e , d e s t i n a t i o n < = n − 1 0 <= source, destination <= n - 1 0<=source,destination<=n−1
- 不存在重复边 不存在重复边 不存在重复边
- 不存在指向顶点自身的边 不存在指向顶点自身的边 不存在指向顶点自身的边
3.思路
点的范围都给出来了,这应该算是并查集模版题把,又给我水了一题。
4.算法实现
class Solution {
public boolean validPath(int n, int[][] edges, int source, int destination) {
int[] f = new int[n];
for(int i = 0; i < n; i++){
f[i] = i;
}
for(int[] edge : edges){
union(f, edge[0], edge[1]);
}
return find(f, source) == find(f, destination);
}
private void union(int[] f ,int a, int b){
f[find(f, a)] = find(f, b);
}
private int find(int[] f, int a){
if(f[a] != a) f[a] = find(f, f[a]);
return f[a];
}
}
二、蓝桥题目
1.最优包含
题目描述
我们称一个字符串
S
S
S 包含字符串
T
T
T 是指
T
T
T 是
S
S
S 的一个子序列,即可以从字符串
S
S
S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与
T
T
T 完全一样。
给定两个字符串 S S S 和 T T T,请问最少修改 S S S 中的多少个字符,能使 S S S 包含 T T T ?
其中,
1
≤
∣
T
∣
≤
∣
S
∣
≤
10001
≤
∣
T
∣
≤
∣
S
∣
≤
1000
1 \leq |T| \leq |S| \leq 10001≤∣T∣≤∣S∣≤1000
1≤∣T∣≤∣S∣≤10001≤∣T∣≤∣S∣≤1000。
输入描述
输入两行,每行一个字符串。
第一行的字符串为 S S S,第二行的字符串为 T T T。
两个字符串均非空而且只包含大写英文字母。
输出描述
输出一个整数,表示答案。
2.测试用例
输入:
ABCDEABCD
XAABZ
输出:
3
3.思路
最初以为是问题求的是S, T两个字符串的公共子序列,但似乎不是这样,思路就一下子没转换过来,花了很长时间。不过核心思想还是动态规划。
4.算法实现
import java.util.*;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
char[] s1 = scan.next().toCharArray();
char[] s2 = scan.next().toCharArray();
int[][] dp = new int[s1.length+1][s2.length+1];
int max = 0;
for(int[] d : dp){
Arrays.fill(d, 0x3f3f3f);
}
dp[0][0] = 0;
for(int i = 1; i <= s1.length; i++){
dp[i][0] = 0;
for(int j = 1; j <= s2.length; j++){
if(s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = Math.min(dp[i-1][j], dp[i-1][j-1] + 1);
}
}
}
System.out.println(dp[s1.length][s2.length]);
scan.close();
}
}