解题思路
给定字符串 s,每轮给出一个对字符集的排列,表示优先级(越靠前优先级越高)。在该轮中,每个位置 i>0 的字符 s[i] 若其左邻居 s[i-1] 的优先级更高,则 s[i] 被同时消灭。也就是说:设 rank[c] 为该轮中字符 c 的名次(0 表示最高),那么当且仅当 rank[s[i-1]] < rank[s[i]] 时,位置 i 会被删除;其它位置保留。所有删除在本轮“同时”发生,判断时都以本轮开始时的原串为准。
据此可用线性扫描模拟每一轮:
- 先把本轮的排列转成
rank[26]。
- 从左到右扫描原串,保留
s[0],对 i=1..len-1,若 rank[s[i-1]] >= rank[s[i]] 则保留 s[i],否则丢弃。
- 扫描过程中顺便统计新串的不同字符种类数,用于判断何时首次变为“单一字符”。