0
点赞
收藏
分享

微信扫一扫

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

雨鸣静声 03-09 12:00 阅读 8

给定一个字符串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!");
    }
}
举报

相关推荐

0 条评论