嘻嘻,这次依旧没能做出来,参考的大佬的代码,现在,我将回顾一下大佬的思路,从大佬的代码中汲取经验。
我的思考:
先模拟一下本题的流程:
例如:(((()
首先,我们发现第一个(【0】,接着我们需要为它找一个配对的)。往后,我们又发现一个(【1】,暂停(【0】的寻找,然后为(【1】找配对······才发现了一个)。发现一个新的“(”的时候,都会重新为它找“)”。
满足以下特征的问题,优先考虑递归(我问的豆包哦!):
- 问题具有自相似性(大问题和子问题的解决逻辑完全一样);
- 问题存在明确的终止条件(拆解到最小子问题后能直接得出结果);
- 问题存在嵌套层级(子问题嵌套在大问题中,处理完子问题才能处理大问题)。
哇塞!这个题非常符合递归的思路!所以我们就用递归来做!
那现在就来考虑这个递归函数如何定义了。
首先定义,这个递归函数的主要作用是标记没有找到配对的“(”,只要发现了“(”,我们就调用这个奇妙的递归函数。只要我们发现了有“)”与之配对,我们就不标记“(”而这个递归函数,也可以保障有配对的“)”不会被标记。
这个指针pin也很是精妙,它“继承”了k旧的值,并且可以帮助标记没有配对的“(”。因为递归就像多层大蛋糕,进行完一层后,会自动回到下一层。
这段代码里也有很多我新学到的函数。下面是我查到的相关资料。
1.fill():用一个给定值去填充所有元素。
fill_n():用一个给定值填充前n个元素。
2.strlen函数用于计算字符串的长度,即字符串中字符的个数,不包括字符串末尾的空字符\0。该函数的头文件是string.h。这也是代码中要规定sign[len] = '\0'的原因,如果没有 '\0',程序会一直往后读内存,导致越界。
#include <bits/stdc++.h>
using namespace std ;
const int N = 105 ;
char s[N] , sign[N] ;
int k , len ;
void match(){
int pin = k ++ ;
while(k < len){
if(s[k] == ')') return ;
else if(s[k] == '(') match() ;
k ++ ;
}
sign[pin] = '$' ;
}
int main(){
while(cin >> s){
len = strlen(s) ;
fill(sign , sign+len , ' ') ;
sign[len] = '\0' ; k = 0 ;
while(k < len){
if(s[k] == ')') sign[k] = '?' ;
else if(s[k] == '(') match() ;
k ++ ;
}
cout << s << endl << sign << endl ;
}
return 0 ;
}
&spm=1001.2101.3001.5002&articleId=156061051&d=1&t=3&u=21138894da2944b194a90851efff9409)
918

被折叠的 条评论
为什么被折叠?



