the monster
題目大意:
給出乙個串,只包含 ( ? ) 三種符號,求出有多少個子串是完美匹配的.
比如
( ) ? ) => ( ) ( ) 完美匹配
( ( ) ?=> ( ( ) )完美匹配
? ? ? ?=>
( )( )
=> ( ( ) )
算一種子串
length<5000 ,1000ms
分析:
這個長度和時間限制比較詭異,想不到比較好的方法,猜想應該是在 n2 上的基礎上做一點優化.結果確實是這樣的
列舉兩個端點沒有試過,可能會超時
列舉起點開始往後遍歷,做標記
if (
cnt++
else
if )
cnt--
else
f++cnt++
先把 ? 當 ( 算
如果 ) 太多了 break
如果 ? 可以取到值 使得這個子串成立, 答案++;
這樣就做完了
並沒有
少了關鍵的一步沒做出來… 如果僅僅是按照這樣小關係來算會出現錯誤
原因在於每次得到的都是當前位置的最終結果 並不知道先後順序 使得 ? ( 和 ( ? 的處理情況一樣 都會使得答案+1
但是先後順序是沒法得到的,怎麼避免 ? ( 的情況呢
容易想到 ? ( 中 ? 不可能是未知量 而是確定的 (
在判斷的之前先把能確定下的 ? 全部確定下來,剩下的全是可變的 ? ,再判斷能否按照題目要求變化即可.
具體實現:
#include
using
namespace
std;
#define pb push_back
#define inf 0x3f3f3f3f
#define mem(s,t) memset(s,t,sizeof s)
typedef pair pii;
typedef
long
long ll;
const
int maxn =1e5+10;
int main()
else
if(s[j]==')')
else
if(cnt<0) break;
f=min(f,cnt/2);//最多需要 cnt/2個 的 ?來參與變化 其他的?都是可確定量
if(cnt%2==0 && cnt/2
<=f) ans++;//長度為偶數 && 可以取到 cnt/2的值}}
cout
0;}
列印匹配括號
開始抽空做一些演算法題,留下記錄作為菜鳥的成長見證吧。這道題來自於cracking the coding interview,要求列印n對括號的所有可能匹配。我採用遞迴來做,這樣編寫比較方便而且容易弄懂,但用迭代應該會效率快不少而且遞迴一定能轉換成迭代吧,以後有空研究下 如下 include std...
括號匹配(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...
括號匹配(二)
題目 問題 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的,所需括號個數為 0.是匹配的,所需括號個數為 0.是不匹配的,所需最少括號個數為 3.是不匹配的,所需最少括號個數為 2.分析 此題來自 作者同時給出了正確答案。但是,感覺答案還不是特別...