0

0

打印所有通过替换通配符“?”而形成的平衡括号字符串

PHPz

PHPz

发布时间:2023-09-08 15:25:02

|

1000人浏览过

|

来源于tutorialspoint

转载

打印所有通过替换通配符“?”而形成的平衡括号字符串

平衡括号意味着如果我们有一串括号,那么每个开括号都有一个对应的闭括号,并且括号对是正确嵌套的。字符串的大小应该是偶数。在这个问题中,我们给出了一个包含字符'?'的括号字符串,我们的任务是通过将'?'替换为适当的括号来形成每个可能的平衡括号字符串。在我们给定的字符串中,只使用圆括号'('和')'。

示例示例

Input 1: str = “()(?)?”
Output 1: ()(()) 

Explanation

的中文翻译为:

解释

只有一个平衡的字符串可以通过替换'?'来形成。

Input 2: str = “??????”
Output 2: ((()))
(()())
(())()
()(())
()()()

Explanation

的中文翻译为:

解释

有两种可能的方法来形成一个平衡的字符串。

  • 一种方法是用一个开括号替换索引0、1和2,用一个闭括号替换其他索引。

  • 第二种方法是用一个开括号替换索引0、1和3,并用一个闭括号替换其他索引。

  • 第三种方法是用开括号替换索引0、1和4,用闭括号替换其他索引。

  • 第四种方法是用一个开括号替换索引为0、2和3的位置,用一个闭括号替换其他索引的位置。

  • 最后一种方法是用开括号替换索引0、2和4,用闭括号替换其他索引。

方法

我们已经看到了上面给定字符串的示例,让我们继续下一步的方法-

我们可以使用回溯法来解决这个问题。

让我们在下面讨论这种方法 -

  • 首先,我们将初始化一个名为'create'的函数,用于在将'?'替换为括号后创建所有可能的字符串,参数为str和index = 0。

  • 在这个函数中,

  • −> 首先,我们设置了基本条件。如果我们到达了字符串的结束点,那么我们必须将该字符串传递给“check”函数来验证字符串是否平衡。如果它是平衡的,则打印该字符串。

    −>如果字符串的当前字符是‘?’,

    首先,将其替换为开括号,并调用相同的函数来检查是否到达字符串的末尾。

    Magic Write
    Magic Write

    Canva旗下AI文案生成器

    下载

    其次,用闭括号替换它,并再次调用相同的函数来检查我们是否已经到达字符串的末尾。

    最后,我们回溯字符串并将当前字符赋值为‘?’

    −> 否则,如果字符串的当前字符是括号,则通过调用相同的函数移动到下一个索引。

  • 初始化'check'函数以验证字符串是否平衡。

  • −> 在这个函数中,我们初始化堆栈,然后进行检查

    −> 如果字符串的第一个字符是闭括号,则返回false

    −> 如果当前括号已关闭,则有两种情况:如果栈为空,则返回false,因为没有对应的开括号。否则,从栈中弹出对应的开括号。

    −> 最后,我们检查堆栈是否为空,如果为空则表示字符串是平衡的,返回true,否则还有一些括号剩余,表示字符串不平衡,返回false。

Example

的中文翻译为:

示例

下面是用于上述回溯方法获取所有平衡字符串的C++代码

#include 
using namespace std; 
// Function 'check' to verify whether the string is balanced or not
bool check(string str){
   stack S; // created stack 
   
// If the first character of the string is a close bracket, then return false
   if (str[0] == ')') {
      return false;
   } 
   
   // Traverse the string using for loop 
   for (int i = 0; i < str.size(); i++) { 
   
      // If the current character is an open bracket, then push it into the stack
      if (str[i] == '(') { 
         S.push('(');
      } 
      
      // If the current character is a close bracket
      else { 
      
         // If the stack is empty, there is no corresponding open bracket return false
         if (S.empty()){
            return false;
         }
         
         // Else pop the corresponding opening bracket from the stack
         else
            S.pop();
      }
   } 
   
   // If the stack is empty, return true
   if (S.empty()){
      return true;
   }
   else {
      return false;
   }
} 

// Function 'create' to create all possible bracket strings
void create(string str, int i){ 

   // If reached the end of the string
   if (i == str.size()) { 
   
      // passed 'str' to the 'check' function to verify whether the string is balanced or not
      if (check(str)) { 
      
         // If it is a balanced string
         cout<< str << endl; // print the string
      }
      return; 
   } 
   
   // If the current character of the string is '?'
   if (str[i] == '?') { 
      str[i] = '('; // replace ? with (
      create(str, i + 1); // continue to next character 
      str[i] = ')'; // replace ? with )
      create(str, i + 1); // continue to next character 
      
      // backtrack
      str[i] = '?';
   }
   
   // If the current character is bracketed then move to the next index
   else {
      create(str, i + 1);
   }
} 
int main(){
   string str = "??????"; //given string 
   
   // Call the function
   create (str, 0);
   return 0;
}

输出

((()))
(()())
(())()
()(())
()()()

时间复杂度和空间复杂度

上述代码的时间复杂度为O(N*(2^N)),因为我们需要在字符串上进行回溯。

上述代码的空间复杂度为O(N),因为我们将括号存储在堆栈中。

其中N是字符串的大小。

结论

在本教程中,我们实现了一个程序,用于打印所有平衡的括号字符串,可以通过替换通配符‘?’来形成。我们实现了一种回溯的方法。时间复杂度为O(N*(2^N),空间复杂度为O(N)。其中N是字符串的大小。

相关文章

全能打印神器
全能打印神器

全能打印神器是一款非常好用的打印软件,可以在电脑、手机、平板电脑等设备上使用。支持无线打印和云打印,操作非常简单,使用起来也非常方便,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

619

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

550

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

545

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

162

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

81

2025.08.07

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号