苹果面试题: 区间合并
描述
现在给你两个字符串区间(按字典顺序), 请你判断两个区间是否可以合并。
字符串区间[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;
}
}
}