什么是联机算法?
联机算法是在任意时刻算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。
该算法仅需要常量空间并以线性时间运行,因此联机算法几乎是完美的算法。
优点
- 占用空间少,所用时间少
缺点
- 不宜设计,正确性不易观察,同时附加保留信息较少
什么是平衡符号?
所谓平衡符号就是说,每一个右花括号、右方括号、右大括号等符号,必然要对应一个相应的左花括号、左方括号以及左大括号。
例如:
- 1.序列:{[()]} 是合法的。
- 2.序列:{[()]}} 则是非法的,因为它的符号不平衡。
下面是相应的代码实现
import java.util.*;
public class EquilibriumSymbolCheck {
/**
* 使用联机算法实现符号平衡的校验
*
* 基本思路:
* 将字符串转成字符数组顺序读取,如果字符是一个开放符号则将该开放符号压栈。如果读到的符号是一个闭合符号,
* 此时弹栈,将该闭合符号与栈中探出的元素进行比较。如果比较结果是二者相同,则继续读取。如果比较结果是二者
* 不相等,此时直接返回false。
*
* @param string 被校验的字符串
* @param map 校验规则map。格式为 map(开放符号,闭合符号),开放符号和闭合符号可以设置多个(必须成对出现)。
* @return
*/
public static Boolean validString(String string,Map map) {
Stack<Character> stack = new Stack<>();
char[] chars = string.toCharArray();
//标志位,用于判断该对栈进行何种操作
int flag = 0;
for (int i = 0; i < chars.length; i++) {
//用于校验类似双引号"和单引号'这种开放符号和闭合符号相等的情况
if (map.containsValue(chars[i]) && map.containsKey(chars[i])) {
if (flag == 0) {
stack.push(chars[i]);
flag++;
continue;
} else {
if (!stack.pop().equals(map.get((Character) chars[i]))) {
return false;
} else {
flag--;
continue;
}
}
}
//将开放符号压栈
if (map.containsKey(chars[i])) {
stack.push(chars[i]);
continue;
}
//将开放符号弹栈,并进行比较
if (map.containsValue(chars[i])) {
if (stack.empty())
return false;
if (!map.get(stack.pop()).equals(chars[i]))
return false;
}
}
if (!stack.empty()) {
return false;
}
return true;
}