当前位置: 首页 > article >正文

贪心算法--给定一个只包含X和.字符串

给定一个字符串str, 只有 ‘X’和’.'两种字符构成。
'X’表示墙,不能放灯,也不需要点亮。
'.'表示居民点,可以放灯,需要点亮。
如果灯放在i位置,可以让 i-1,和i和i+1三个位置被点亮.
返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。

import java.util.HashSet;

public class Light {

    public static int minLight1(String road) {
        if (road == null || road.length() == 0) {
            return 0;
        }
        return process(road, 0, new HashSet<>());
    }

    public static int process(String road, int i,  HashSet<Integer> lights){
        if(i == road.length()){
            for (int j = 0; j < road.length(); j++) {
                if(road.charAt(j) != 'X'){
                    if(!lights.contains(j-1) && !lights.contains(j) && !lights.contains(j+1)){
                        return Integer.MAX_VALUE;
                    }
                }
            }
            return lights.size();
        }else {
            int y = Integer.MAX_VALUE;
            //int n = Integer.MAX_VALUE;
            if(road.charAt(i) != 'X') {
                lights.add(i);
                y = process(road, i + 1, lights);
                lights.remove(i);
            }
            int n = process(road, i + 1, lights);
            return Math.min(y, n);
        }
    }

    public static int minLight2(String road) {
        if(road == null || road.length() == 0){
            return 0;
        }

        int light = 0;
        int i = 0;
        int len = road.length();
        while (i < len){
            if(road.charAt(i) == 'X'){
                i++;
            }else{
                light++;
                if(i+1 == len){
                    break;
                }else if(road.charAt(i+1) == 'X'){
                    i = i + 2;
                }else{
                    i = i + 3;
                }
            }
        }
        return light;
    }

    public static int minLight3(String road) {
        char[] str = road.toCharArray();
        int cur = 0;
        int light = 0;
        for (char c : str) {
            if (c == 'X') {
                light += (cur + 2) / 3;
                cur = 0;
            } else {
                cur++;
            }
        }
        light += (cur + 2) / 3;
        return light;
    }

    // for test
    public static String randomString(int len) {
        char[] res = new char[(int) (Math.random() * len) + 1];
        for (int i = 0; i < res.length; i++) {
            res[i] = Math.random() < 0.5 ? 'X' : '.';
        }
        return String.valueOf(res);
    }

    public static void main(String[] args) {
        int len = 20;
        int testTime = 100000;
        for (int i = 0; i < testTime; i++) {
            String test = randomString(len);
            int ans1 = minLight1(test);
            int ans2 = minLight2(test);
            int ans3 = minLight3(test);
            if (ans1 != ans2 || ans2 != ans3) {
                System.out.println("oops!");
            }
        }
        System.out.println("finish!");
    }
}

http://www.kler.cn/a/571832.html

相关文章:

  • AI-Ollama本地大语言模型运行框架与Ollama javascript接入
  • Centos修改ip
  • Pytorch实现之促进恶意软件图像合成GAN
  • Matlab——添加坐标轴虚线网格的方法
  • 某系统webpack接口泄露引发的一系列漏洞
  • Python 深度学习入门:TensorFlow 与 PyTorch,神经网络模型构建实战
  • 决策树、朴素贝叶斯、随机森林、支持向量机、XGBoost 和 LightGBM算法的R语言实现
  • Leetcode 面试150题(三)
  • FastGPT 引申:Rerank 函数调用实例
  • 小白入坑向:Java 全栈系统性学习推荐路线之一
  • hive tez使用小文件合并参数后,单个文件大小大于128MB
  • 单片机应用:定时闪烁的LED小灯的实现
  • 非平衡数据的处理
  • DeepSeek本地接口调用(Ollama)
  • 【一文学会 HTML】
  • 基于单片机的可燃气体火灾报警器的设计与实现
  • 2.反向传播机制简述——大模型开发深度学习理论基础
  • 如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档
  • 【每日学点HarmonyOS Next知识】网络请求回调toast问题、Popup问题、禁止弹窗返回、navigation折叠屏不显示返回键、响应式布局
  • 匹配HTML标签中 href 属性的正则表达式