当前位置: 面试刷题>> 合法字符串 (经典算法题500道)


题目描述(补充完整):

题目:合法字符串的验证与构造

给定一个由小写字母、数字及括号(())组成的字符串 s,要求编写一个函数来验证该字符串是否为合法的括号序列,并且如果字符串中不包含非法的括号组合,则要求返回通过添加最小数量的字符(可以是任意字符,但为简化问题,这里假设我们只考虑添加括号)使该字符串成为合法括号序列的一种方法。如果原字符串已经是合法的括号序列,则直接返回原字符串。

合法括号序列的定义

  • 每个左括号 ( 必须有一个对应的右括号 )
  • 每个右括号 ) 必须有一个对应的左括号 (
  • 括号可以嵌套,但必须是正确嵌套的。

示例

输入:s = "((abc))" 输出:"((abc))"(已经是合法的括号序列,无需修改)

输入:s = "(abc" 输出:"(abc)"(添加了一个右括号使其成为合法序列)

输入:s = "())" 输出:"()()"(需要添加一个左括号来匹配第一个右括号)

注意:题目要求返回的是一种可能的合法括号序列,而非所有可能的序列。

PHP 示例代码

function makeValidString($s) {
    $stack = [];
    $result = '';

    for ($i = 0; $i < strlen($s); $i++) {
        $char = $s[$i];
        if ($char == '(') {
            array_push($stack, $char);
            $result .= $char;
        } elseif ($char == ')') {
            if (empty($stack)) {
                // 如果栈为空,说明没有匹配的左括号,添加一个左括号到结果中
                $result .= '(';
            }
            array_pop($stack); // 匹配成功,移除栈顶元素
            $result .= $char;
        } else {
            $result .= $char; // 非括号字符直接添加到结果中
        }
    }

    // 如果栈中还有剩余左括号,说明缺少对应的右括号,依次添加
    while (!empty($stack)) {
        $result .= ')';
        array_pop($stack);
    }

    return $result;
}

// 示例测试
echo makeValidString("((abc))"); // 输出: ((abc))
echo PHP_EOL;
echo makeValidString("(abc");    // 输出: (abc)
echo PHP_EOL;
echo makeValidString("())");     // 输出: ()()

Python 示例代码

def makeValidString(s):
    stack = []
    result = []

    for char in s:
        if char == '(':
            stack.append(char)
            result.append(char)
        elif char == ')':
            if not stack:
                result.append('(')  # 添加左括号以匹配
            stack.pop()  # 匹配成功,弹出栈顶元素
            result.append(char)
        else:
            result.append(char)  # 非括号字符直接添加

    # 栈中剩余左括号需要添加对应的右括号
    result.extend(')' * len(stack))

    return ''.join(result)

# 示例测试
print(makeValidString("((abc))"))  # 输出: ((abc))
print(makeValidString("(abc"))     # 输出: (abc)
print(makeValidString("())"))      # 输出: ()()

JavaScript 示例代码

function makeValidString(s) {
    let stack = [];
    let result = '';

    for (let char of s) {
        if (char === '(') {
            stack.push(char);
            result += char;
        } else if (char === ')') {
            if (stack.length === 0) {
                // 栈为空,添加一个左括号
                result += '(';
            }
            stack.pop(); // 匹配成功,弹出栈顶元素
            result += char;
        } else {
            result += char; // 非括号字符直接添加
        }
    }

    // 栈中剩余左括号需要添加对应的右括号
    while (stack.length > 0) {
        result += ')';
        stack.pop();
    }

    return result;
}

// 示例测试
console.log(makeValidString("((abc))")); // 输出: ((abc))
console.log(makeValidString("(abc"));    // 输出: (abc)
console.log(makeValidString("())"));     // 输出: ()()

码小课网站中有更多相关内容分享给大家学习,涵盖了算法、数据结构、编程语言等多个方面,欢迎访问学习。

推荐面试题