Apple算法面试宝典:字符串/区间合并

苹果面试题: 区间合并

描述
现在给你两个字符串区间(按字典顺序), 请你判断两个区间是否可以合并。
字符串区间[a, b),包括所有以a开头的字符串。
例如,区间[a, b)和区间[ab,c)是可以合并的,区间[a,b)和区间[b, c]也是可以合并的。
若是可以合并请返回true, 不可以请返回false。
若两个区间A和B,满足A⋃B是一个连续区间,则A和B可合并。

在线评测地址

样例1

输入:
"[a,b]" "[b,c]"
输出: 
true

样例2

输入:
"[a,b]" "(b,c]"
输出: 
true

样例3

输入:
"[a,b)" "(b,c]"
输出: 
false

样例4

输入:
"(b,c)" "[a,b]"
输出: 
true

解题思路
用四个标记两个区间左右的开闭情况,开区间为0,闭区间为1; 将输入的字符串以分隔符分开,存入数组,两个数组代表两个区间,每个数组中两个字符串分别表示两个端点; 比较两个区间的左端点大小,左端点较小(相等时则任意)的区间为L1,另一区间为L2; 比较L1右端点和L2左端点,以下情况返回true: 1.L1右端点大于区间2左端点 2.L1右端点和区间2左端点相等且这两个端点不同时为开区间 3.L1右端点字符串尾加’a’与L2左端点相等,且两端点同时为开区间 其他情况返回false。

复杂度分析
时间复杂度:O(1)
不会随着数据的增大而增加时间复杂度。
空间复杂度:O(1)
不需要开辟额外的空间。

源代码

public class Solution {
    /**
     * @param interval_A: a string represent a interval.
     * @param interval_B: a string represent a interval.
     * @return: if two intervals can merge return true, otherwise false.
     */
    public boolean MergeJudge(String interval_A, String interval_B) {
        
        String[] interval_1, interval_2;
        boolean flag_L1 = false, flag_R1 = false, flag_L2 = false, flag_R2 = false;
        if (interval_A.charAt(0) == '[') {
            flag_L1 = true;
        }
        if (interval_A.charAt(interval_A.length() - 1) == ']') {
            flag_R1 = true;
        }
        interval_1 = interval_A.split(",|\\[|\\(|\\)|\\]");
        if (interval_B.charAt(0) == '[') {
            flag_L2 = true;
        }
        if (interval_B.charAt(interval_B.length() - 1) == ']') {
            flag_R2 = true;
        }
        interval_2 = interval_B.split(",|\\[|\\(|\\)|\\]");
        if (interval_1[1].compareTo(interval_2[1]) > 0) {
            String next = interval_2[2] + "a";
            if (next.compareTo(interval_1[1]) == 0) {
                if (flag_L1 && flag_R2) {
                    return true;
                }
            } else if (interval_2[2].compareTo(interval_1[1]) == 0) {
                if (!flag_L1 && !flag_R2) {
                    return false;
                }
                return true;
            } else if (interval_2[2].compareTo(interval_1[1]) > 0) {
                return true;
            }
            return false;
        }else {
            String next = interval_1[2] + "a";
            if (next.compareTo(interval_2[1]) == 0) {
                if (flag_L2 && flag_R1) {
                    return true;
                }
            }
            else if (interval_1[2].compareTo(interval_2[1]) == 0) {
                if (!flag_L2 && !flag_R1) {
                    return false;
                }
                return true;
            }
            else if (interval_1[2].compareTo(interval_2[1]) > 0) {
                return true;
            }
            return false;
        }
    }
}

更多题解参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值