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

贪心算法--给定一个只包含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!");
    }
}

相关文章:

  • mysql表的约束
  • springboot可以同时处理多少个请求
  • 2503,D比C更易重构
  • 将md格式转jupyter并运行
  • Redis 实现延迟队列的方案
  • 【STM32项目实战系列】基于STM32G474的FDCAN驱动配置
  • 动态规划_路径问题(典型算法思想)—— OJ例题算法解析思路
  • C++20 中位移位运算符的统一行为:深入解析与实践指南
  • 紧跟 Web3 热潮,RuleOS 如何成为行业新宠?
  • 月结保障:回滚慢、行锁频发
  • UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持
  • OpenCV计算摄影学(13)实现 Reinhard 全局色调映射算法的类cv::TonemapReinhard
  • 基于Arcgis的python脚本实现相邻矢量面的高度字段取平均值
  • 力扣-动态规划-583 两个字符的删除操作
  • 从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(0)系统设计与工具链说明
  • QT 作业 day4
  • 浅谈开发环境
  • 视音频数据处理入门:颜色空间(二)---ffmpeg
  • 前端开发好用的AI工具介绍
  • AI 芯片全解析:定义、市场趋势与主流芯片对比
  • 网站外链哪里做/一般的电脑培训班要多少钱
  • 贵州企业网站建设公司/北京seo优化厂家
  • dedecms织梦系统网站防会员注册机/南宁百度关键词推广
  • ps做网站对齐技巧/google play商店
  • 宁波网站建设报价/关键词搜索工具有哪些
  • app开发公司宣传片/杭州seo薪资水平