与其明天开始,不如现在行动!
1 照亮居民
1.1 题目描述
给定一个字符串string,只由
'X'
和'.'
两种字符构成
'X'
表示墙,不能放灯,也不需要点亮
'.'
表示居民点,可以放灯,需要点亮如果灯放在
i
位置,可以让i - 1
、i
和i + 1
三个位置被点亮返回如果点亮string中所有需要点亮的位置,需要几盏灯
1.2 解决思路
- 暴力求解
- 用递归将每种情况都列举
- 返回能照亮所有居民点的使用最少灯的数量
- 贪心策略
- 对于第一个位置
- 如果是
'X'
,那么此时重新考虑下一个点 - 如果是
'.'
,此时这个点位置记作i
,下一个点记为i + 1
- 如果
i + 1
是'X'
,就要在i
位置放灯,重新考虑下一个点 - 如果
i + 1
是'.'
,此时考虑第三个点i + 2
- 如果
i + 2
是'X'
,就要在i + 1
位置放灯,重新考虑下一个点 - 如果
i + 2
是'.'
,此时在i + 2
位置放灯,重新考虑下一个点
- 如果
- 如果
- 如果是
- 对每一个位置都考虑上面的情况,直到所有点都被安排完
- 对于第一个位置
1.3 代码实现
public class PutLights {
public static int putLights(String str) {
if (str == null) {
return 0;
}
return process(str.toCharArray(), 0, new HashSet<>());
}
private static int process(char[] str, int index, HashSet<Integer> lightIndex) {
if (str.length == index) {
for (int i = 0; i < str.length; i++) {
if (str[i] != 'X') {
if (!lightIndex.contains(i) && !lightIndex.contains(i - 1) && !lightIndex.contains(i + 1)) {
return Integer.MAX_VALUE;
}
}
}
return lightIndex.size();
}else {
int no = process(str, index + 1, lightIndex);
int yes = Integer.MAX_VALUE;
if (str[index] != 'X') {
lightIndex.add(index);
yes = process(str, index + 1, lightIndex);
lightIndex.remove(index);
}
return Math.min(yes, no);
}
}
public static int putLight2(String str) {
if (str == null) {
return 0;
}
char[] strCharArray = str.toCharArray();
int index = 0;
int light = 0;
while (index < strCharArray.length) {
if (strCharArray[index] == 'X') {
index++;
}else {
light++;
if (index + 1 == strCharArray.length) {
break;
}
if (strCharArray[index + 1] == 'X') {
index = index + 2;
}else {
index = index + 3;
}
}
}
return light;
}
public static void main(String[] args) {
String str = "X.XX....";
if (putLights(str) == putLight2(str)) {
System.out.println("Finish!");
}else {
System.out.println("Oops!");
}
}
}
💎总结
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!