一題DP題
輸入一串由'(',')','[',']'組成的字符串,對於[ ],( ),[ ( ) ], ( [ ] ),都是合法的匹配。而對於( ],[ )等則是不合法的匹配,你的任務是找出括號集中最長合法匹配
我們先處理只有'('和')'的情況,遇到一個')',如果前面是一個'(',那麼長度是2的"()"肯定是可以的了,但是如果'('前面已經有匹配了的,如前面如果是一個已經匹配了的"()",那麼我們需要把它也加進去.
如上,我們再把'['和']'加進來
0.13s
DP
*/
#include "stdio.h"
#include <string.h>
char str[100002] ;
int DP[100002] ;
bool mark[100002] ;
int main ( void )
{
int i, j ;
while ( 1 == scanf ( "%s", str ) ) {
int start = 0, end = -1, len = -1 ;
DP[0] = -1 ; mark[0] = false ;
int pos = strlen(str) ;
for ( i = 1 ; i < pos ; i++ ) {
if ( str[i] == '(' || str[i] == '[' ) {
mark[i] = false ;
//DP[i] = -1 ;
}
else if ( str[i] == ')' ) {
if ( str[i-1] == '(' ) {
if ( i-2 >= 0 && mark[i-2] ) {
mark[i] = true ;
DP[i] = DP[i-2] ;
}
else {
mark[i] = true ;
DP[i] = i-1 ;
}
if ( len < i-DP[i] ) {
len = i - DP[i] ;
start = DP[i] ;
end = i ;
}
}
else if ( mark[i-1] && DP[i-1] != 0 ) {
if ( str[DP[i-1]-1] == '(' ) {
mark[i] = true ;
if ( DP[i-1]-2 >= 0 && mark[DP[i-1]-2] )
DP[i] = DP[DP[i-1]-2] ;
else
DP[i] = DP[i-1]-1 ;
if ( len < i-DP[i] ) {
len = i - DP[i] ;
start = DP[i] ;
end = i ;
}
}
else mark[i] = false ;
}
else mark[i] = false ;
}
else if ( str[i] == ']' ) {
if ( str[i-1] == '[' ) {
if ( i-2 >= 0 && mark[i-2] ) {
mark[i] = true ;
DP[i] = DP[i-2] ;
}
else {
mark[i] = true ;
DP[i] = i-1 ;
}
if ( len < i-DP[i] ) {
len = i - DP[i] ;
start = DP[i] ;
end = i ;
}
}
else if ( mark[i-1] && DP[i-1] != 0 ) {
if ( str[DP[i-1]-1] == '[' ) {
mark[i] = true ;
if ( DP[i-1]-2 >= 0 && mark[DP[i-1]-2] )
DP[i] = DP[DP[i-1]-2] ;
else
DP[i] = DP[i-1]-1 ;
if ( len < i-DP[i] ) {
len = i - DP[i] ;
start = DP[i] ;
end = i ;
}
}
else mark[i] = false ;
}
else mark[i] = false ;
}
}
for ( i = start ; i <= end ; i++ ) {
printf ( "%c", str[i] ) ;
}
printf ( " " ) ;
}
return 0 ;
}