回溯
This commit is contained in:
parent
508bf989fc
commit
17bbb0f3ed
@ -0,0 +1,59 @@
|
|||||||
|
package cn.whaifree.leetCode.BackTracking;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/2/18 16:41
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode491 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
new Solution().findSubsequences(new int[]{4,6,7,5,7}).forEach(list -> {
|
||||||
|
System.out.println(list);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> path = new ArrayList<>();
|
||||||
|
public List<List<Integer>> findSubsequences(int[] nums) {
|
||||||
|
|
||||||
|
backTracking(nums, 0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void backTracking(int[] nums, int index) {
|
||||||
|
|
||||||
|
if (path.size() > 1) {
|
||||||
|
// 插入res
|
||||||
|
res.add(new ArrayList<>(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Integer> set = new HashSet<>();
|
||||||
|
for (int i = index; i < nums.length; i++) {
|
||||||
|
// 如果不满足非递减,即递增,这个子树不保留
|
||||||
|
if ((!path.isEmpty() && path.get(path.size() - 1) > nums[i]) // 递增
|
||||||
|
|| set.contains(nums[i]) // 如[4,7,xx,7],[4,7]已经出现在path中,7加入了set,那么在本层后面遇到7的时候,就直接continues
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
set.add(nums[i]);
|
||||||
|
path.add(nums[i]);
|
||||||
|
backTracking(nums, i + 1);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package cn.whaifree.leetCode.BackTracking;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/2/18 10:29
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode78 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
System.out.println(new Solution().subsets(new int[]{1, 2, 3}));
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> temp = new ArrayList<>();
|
||||||
|
public List<List<Integer>> subsets(int[] nums) {
|
||||||
|
backTracking(nums, 0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backTracking(int[] nums, int start) {
|
||||||
|
res.add(new ArrayList<>(temp));
|
||||||
|
if (start >= nums.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = start; i < nums.length ; i++) {
|
||||||
|
temp.add(nums[i]);
|
||||||
|
backTracking(nums,i+1);
|
||||||
|
temp.remove(temp.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package cn.whaifree.leetCode.BackTracking;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/2/18 13:26
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode90 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
new Solution().subsetsWithDup(new int[]{1, 2, 2}).forEach(
|
||||||
|
list -> {
|
||||||
|
System.out.println(list);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> temp = new ArrayList<>();
|
||||||
|
boolean[] used = null;
|
||||||
|
public List<List<Integer>> subsetsWithDup(int[] nums) {
|
||||||
|
Arrays.sort(nums);
|
||||||
|
used = new boolean[nums.length];
|
||||||
|
backTracking(nums, 0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backTracking(int[] nums, int start) {
|
||||||
|
res.add(new ArrayList<>(temp));
|
||||||
|
if (start >= nums.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = start; i < nums.length ; i++) {
|
||||||
|
|
||||||
|
// 1. u1 u2 相同,并且u1曾经被调用过,则不继续进行本次循环
|
||||||
|
// if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// 2. 不使用used数组,跳过当前树层使用过的、相同的元素
|
||||||
|
if ( i > start && nums[i - 1] == nums[i] ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp.add(nums[i]);
|
||||||
|
used[i] = true;
|
||||||
|
backTracking(nums,i+1);
|
||||||
|
temp.remove(temp.size() - 1);
|
||||||
|
used[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
176
src/main/java/cn/whaifree/leetCode/BackTracking/LeetCode93.java
Normal file
176
src/main/java/cn/whaifree/leetCode/BackTracking/LeetCode93.java
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
package cn.whaifree.leetCode.BackTracking;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/2/18 9:27
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode93 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
for (String restoreIpAddress : new Solution1().restoreIpAddresses("101023")) {
|
||||||
|
System.out.println(restoreIpAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
List<String> res = new ArrayList<>();
|
||||||
|
List<String> path = new ArrayList<>();
|
||||||
|
public List<String> restoreIpAddresses(String s) {
|
||||||
|
backTracking(s, 0, 0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* @param start 递归开始标记
|
||||||
|
* @param number 这是第几个切片,4个切片为一组有效返回
|
||||||
|
*/
|
||||||
|
public void backTracking(String s, int start,int number) {
|
||||||
|
// 如果 第5个切片了,则存在多余的字符,直接return
|
||||||
|
if (number > 4) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start >= s.length() && path.size() == 4) {
|
||||||
|
res.add(String.join(".", path));
|
||||||
|
|
||||||
|
// StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
// for (int i = 0; i < path.size() - 1; i++) {
|
||||||
|
// stringBuilder.append(path.get(i)).append(".");
|
||||||
|
// }
|
||||||
|
// stringBuilder.append(path.get(path.size() - 1));
|
||||||
|
// res.add(stringBuilder.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = start; i < s.length() ; i++) {
|
||||||
|
|
||||||
|
if (isValid(s, start, i + 1)) {
|
||||||
|
|
||||||
|
path.add(s.substring(start, i + 1));
|
||||||
|
backTracking(s, i + 1, number + 1);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}else {
|
||||||
|
// 2565 256无效,那么2565直接就无效了
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isValid(String s, int start, int end) {
|
||||||
|
String substring = s.substring(start, end);
|
||||||
|
// 子串最多不超过3个字符
|
||||||
|
if (substring.length() > 3 ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// “01”为非法,"0"为合法
|
||||||
|
if (substring.length() != 1 && substring.startsWith("0")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int integer = Integer.parseInt(substring);
|
||||||
|
if (integer >= 0 && integer <= 255) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过char进行字符串转为int
|
||||||
|
* @param s
|
||||||
|
* @param start
|
||||||
|
* @param end
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean isValid(StringBuilder s, int start, int end){
|
||||||
|
if(start > end)
|
||||||
|
return false;
|
||||||
|
if(s.charAt(start) == '0' && start != end)
|
||||||
|
return false;
|
||||||
|
int num = 0;
|
||||||
|
for(int i = start; i <= end; i++){
|
||||||
|
int digit = s.charAt(i) - '0';
|
||||||
|
num = num * 10 + digit;
|
||||||
|
if(num > 255)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Solution1 {
|
||||||
|
|
||||||
|
List<String> res = new ArrayList<>();
|
||||||
|
List<String> path = new ArrayList<>();
|
||||||
|
public List<String> restoreIpAddresses(String s) {
|
||||||
|
backTracking(s, 0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param s
|
||||||
|
* @param start 递归开始标记
|
||||||
|
*/
|
||||||
|
public void backTracking(String s, int start) {
|
||||||
|
|
||||||
|
if (start >= s.length() && path.size() == 4) {
|
||||||
|
res.add(String.join(".", path));
|
||||||
|
|
||||||
|
// StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
// for (int i = 0; i < path.size() - 1; i++) {
|
||||||
|
// stringBuilder.append(path.get(i)).append(".");
|
||||||
|
// }
|
||||||
|
// stringBuilder.append(path.get(path.size() - 1));
|
||||||
|
// res.add(stringBuilder.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = start; i < s.length() ; i++) {
|
||||||
|
|
||||||
|
if (isValid(s, start, i + 1)) {
|
||||||
|
|
||||||
|
path.add(s.substring(start, i + 1));
|
||||||
|
backTracking(s, i + 1);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}else {
|
||||||
|
// 2565 256无效,那么2565直接就无效了
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isValid(String s, int start, int end) {
|
||||||
|
String substring = s.substring(start, end);
|
||||||
|
// 子串最多不超过3个字符
|
||||||
|
if (substring.length() > 3 ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// “01”为非法,"0"为合法
|
||||||
|
if (substring.length() != 1 && substring.startsWith("0")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int integer = Integer.parseInt(substring);
|
||||||
|
if (integer >= 0 && integer <= 255) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
67
src/main/java/cn/whaifree/redo/redo_24_2_18/LeetCode131.java
Normal file
67
src/main/java/cn/whaifree/redo/redo_24_2_18/LeetCode131.java
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package cn.whaifree.redo.redo_24_2_18;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/2/18 9:04
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode131 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
|
||||||
|
public void test() {
|
||||||
|
String abc = "aab";
|
||||||
|
new Solution().partition(abc).forEach(
|
||||||
|
list -> {
|
||||||
|
System.out.println(list);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
List<List<String>> res = new ArrayList<>();
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
|
public List<List<String>> partition(String s) {
|
||||||
|
backTracing(s,0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void backTracing(String s,int start) {
|
||||||
|
|
||||||
|
// 遍历完了,树到根部了,就记为一次结果
|
||||||
|
if (start >= s.length()) {
|
||||||
|
res.add(new ArrayList<>(list));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = start; i < s.length(); i++) {
|
||||||
|
// 只有当是回文串时,才进行下一次切割
|
||||||
|
if (isHuiWen(s, start, i)) {
|
||||||
|
String substring = s.substring(start, i + 1);
|
||||||
|
list.add(substring);
|
||||||
|
backTracing(s, i + 1);
|
||||||
|
list.remove(list.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHuiWen(String s, int start, int end) {
|
||||||
|
while (start < end) {
|
||||||
|
if (s.charAt(start) != s.charAt(end)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user