题目解析
本题考察逻辑模拟。主要有两个逻辑:
- 判断哪些位置需要被删除
- 更新关键词位置
对于第1点:
- 若当前位置不是空格字符,则不需要删除
- 若当前位置是空格字符,但是前一个位置不是空格字符,则当前位置不是多余空格,不需要删除
- 若当前位置是空格字符,且前一个位置也是空格字符,但是当前位置处于成对单引号内,因此不需要删除
- 其余情况都需要删除
上面逻辑中,如何判断一个字符是否处于成对单引号内?
我们可以定义一个哨兵 isClose,初始为true,表示当前位置不处于成对单引号内。当我们遍历文本,遇到单引号字符时,则将 isClose 取反。
这样,我们根据 isClose 变量值即可判断,当前位置字符是否处于单引号内。
对于第2点,每当我们遇到一个要删除的位置 i 时,则遍历所有关键词 ranges,检查被遍历关键词 ranges[i]:{start, end} 是否在 i 位置之后(即 i < start),若是,则该区间的偏移量 offsets[i] += 1。
需要注意的是:
这里不是直接修改 ranges[i],比如:每发现一个删除位置 i < ranges[i][0] 时,就进行 ranges[i][0] -= 1,ranges[i][1[ -= 1。<