编辑代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  let str = await readline();
  const sets = [];
  let isOpen = false;
  let deleteLeft = 0;
  // const deleteIdx = [];
  const deleteStr = [];
  for (let i = 0; i < str.length; i++) {
    const c = str[i];
    if (c === "(") {
      isOpen = true;
      deleteLeft = i;
      sets.push(new Set());
      continue;
    }
    if (c === ")") {
      isOpen = false;
      // deleteIdx.push([deleteLeft, i + 1]);
      deleteStr.push(str.slice(deleteLeft, i + 1));
      deleteLeft = i + 1;
      if (sets[sets.length - 1].size == 0) sets.pop();
    }
    if (isOpen) {
      // set.add(c);
      sets[sets.length - 1].add(c);
    }
  }
  // 去除原数组中()及()内的字符
  deleteStr.forEach((s) => {
    str = str.replace(s, "");
  });
  // console.log(str, sets);
  // 合并sets中的set
  outer: while (true) {
    for (let i = 0; i < sets.length; i++) {
      for (let j = i + 1; j < sets.length; j++) {
        if (helper(sets[i], sets[j])) {
          sets[i] = new Set([...sets[i], ...sets[j]]);
          sets.splice(j, 1);
          continue outer;
        }
      }
    }
    break;
  }
  console.log(sets);
  let ans = [];
  // for(const set of )
  for (let i = 0; i < str.length; i++) {
    const c = str[i];
    for (let set of sets) {
      const t = [...set].sort()[0];
      if (set.has(c)) ans.push(t);
      else ans.push(c);
    }
  }
  console.log(ans.join(""));
})();
// 比较两个集合是否能合并
const helper = (set1, set2) => {
  for (let c = 97; c <= 122; c++) {
    // 大小写均可
    if (
      (set1.has(String.fromCharCode(c)) ||
        set1.has(String.fromCharCode(c - 32))) &&
      (set2.has(String.fromCharCode(c)) ||
        set2.has(String.fromCharCode(c - 32)))
    )
      return true;
  }
  return false;
};