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


题目描述(补充完整): **题目:合法字符串的验证与构造** 给定一个由小写字母、数字及括号(`(` 和 `)`)组成的字符串 `s`,要求编写一个函数来验证该字符串是否为合法的括号序列,并且如果字符串中不包含非法的括号组合,则要求返回通过添加最小数量的字符(可以是任意字符,但为简化问题,这里假设我们只考虑添加括号)使该字符串成为合法括号序列的一种方法。如果原字符串已经是合法的括号序列,则直接返回原字符串。 **合法括号序列的定义**: - 每个左括号 `(` 必须有一个对应的右括号 `)`。 - 每个右括号 `)` 必须有一个对应的左括号 `(`。 - 括号可以嵌套,但必须是正确嵌套的。 **示例**: 输入:`s = "((abc))"` 输出:`"((abc))"`(已经是合法的括号序列,无需修改) 输入:`s = "(abc"` 输出:`"(abc)"`(添加了一个右括号使其成为合法序列) 输入:`s = "())"` 输出:`"()()"`(需要添加一个左括号来匹配第一个右括号) **注意**:题目要求返回的是**一种**可能的合法括号序列,而非所有可能的序列。 ### PHP 示例代码 ```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 示例代码 ```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 示例代码 ```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("())")); // 输出: ()() ``` **码小课网站中有更多相关内容分享给大家学习**,涵盖了算法、数据结构、编程语言等多个方面,欢迎访问学习。
推荐面试题