package org.example.interview.practice;
/**
* @author xianzhe.ma
* @date 2021/11/3
*/
import java.util.*;
public class NC_121_Permutation {
public ArrayList<String> Permutation(String str) {
int length = str.length();
ArrayList<String> inputList = new ArrayList<>();
for (int i = 0;i<length;i++) {
char c = str.charAt(i);
String temp = String.valueOf(c);
inputList.add(temp);
}
String[] array = new String[length];
inputList.toArray(array);
ArrayList<String> result = new ArrayList<>();
doPerm(array, 0, length, result);
Set<String> set = new HashSet<>();
set.addAll(result);
ArrayList<String> result2 = new ArrayList<>();
result2.addAll(set);
return result2;
}
public void doPerm(String[] array, int start, int end, ArrayList<String> result) {
if (start == end) {
int size = array.length;
StringBuilder stringBuilder = new StringBuilder();
for (int i=0;i<size;i++) {
stringBuilder.append(array[i]);
}
result.add(stringBuilder.toString());
return;
}
for (int i= start;i<end;i++) {
swap(array, start, i);
doPerm(array,start+1,end, result);
swap(array, start, i);
}
}
public void swap(String[] array, int i, int j) {
String temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
package org.example.interview.practice;
/**
* @author xianzhe.ma
* @date 2021/8/22
*/
public class NC_122_MATCH_REGEX {
public static boolean match (String str, String pattern) {
// write code here
int n = str.length();
int m = pattern.length();
boolean[][] f = new boolean[n + 1][m + 1];
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
//分成空正则和非空正则两种
if (j == 0) {
f[i][j] = i == 0;
} else {
//非空正则分为两种情况 * 和 非*
if (pattern.charAt(j - 1) != '*') {
if (i > 0 && (str.charAt(i - 1) == pattern.charAt(j - 1) || pattern.charAt(j - 1) == '.')) {
f[i][j] = f[i - 1][j - 1];
}
} else {
//碰到 * 了,分为看和不看两种情况
//不看
if (j >= 2) {
f[i][j] |= f[i][j - 2];
}
//看
if (i >= 1 && j >= 2 && (str.charAt(i - 1) == pattern.charAt(j - 2) || pattern.charAt(j - 2) == '.')) {
f[i][j] |= f[i - 1][j];
}
}
}
}
}
return f[n][m];
}
public static void main (String[] args) {
String str = "aaa";
String pattern = "aa*";
match(str, pattern);
}
}
package org.example.interview.practice;
import java.util.HashMap;
import java.util.Map;
/**
* @author xianzhe.ma
* @date 2021/12/31
* 和为K的连续子数组
*/
public class NC_125_MAX_LEN_SUB_ARRAY_EQUALSK {
public static int maxlenEqualK(int[] arr, int k) {
// write code here
int len = arr.length;
if (arr == null || len == 0) {
return 0;
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, -1);
int length = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (map.containsKey(sum - k)) {
length = Math.max(i - map.get(sum - k), length);
}
if (!map.containsKey(sum)) {
map.put(sum, i);
}
}
return length;
}
public static void main(String[] args) {
int[] arr = {0,1,2,3};
maxlenEqualK(arr, 3);
}
}
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class NC_123_TREE_SERIALIZE{
int INF = 0x3f3f3f3f;
TreeNode emptyNode = new TreeNode(INF);
String Serialize(TreeNode root) {
if (root == null) return "";
StringBuilder sb = new StringBuilder();
// 使用队列进行层序遍历,起始先将 root 放入队列
Deque<TreeNode> d = new ArrayDeque<>();
d.addLast(root);
while (!d.isEmpty()) {
// 每次从队列中取出元素进行「拼接」,包括「正常节点」和「叶子节点对应的首位空节点」
TreeNode poll = d.pollFirst();
sb.append(poll.val + "_");
// 如果取出的节点不为「占位节点」,则继续往下拓展,同时防止「占位节点」不继续往下拓展
if (!poll.equals(emptyNode)) {
d.addLast(poll.left != null ? poll.left : emptyNode);
d.addLast(poll.right != null ? poll.right : emptyNode);
}
}
return sb.toString();
}
TreeNode Deserialize(String data) {
if (data.equals("")) return null;
// 根据分隔符进行分割
String[] ss = data.split("_");
int n = ss.length;
// 怎么序列化就怎么反序列化
// 使用队列进行层序遍历,起始先将 root 构建出来,并放入队列
TreeNode root = new TreeNode(Integer.parseInt(ss[0]));
Deque<TreeNode> d = new ArrayDeque<>();
d.addLast(root);
for (int i = 1; i < n - 1; i += 2) {
TreeNode poll = d.pollFirst();
// 每次从中取出左右节点对应 val
int a = Integer.parseInt(ss[i]), b = Integer.parseInt(ss[i + 1]);
// 如果左节点对应的值不是 INF,则构建「真实节点」
if (a != INF) {
poll.left = new TreeNode(a);
d.addLast(poll.left);
}
// 如果右节点对应的值不是 INF,则构建「真实节点」
if (b != INF) {
poll.right = new TreeNode(b);
d.addLast(poll.right);
}
}
return root;
}
}