/*** * 問題:括號字串的最長有效長度
* 給定乙個括號字串返回最長的有效字串子串
* * 分析:
* 用動態規劃求解,可以做到時間複雜度為o(n), 額外空間複雜度為o(n)。
* 首先生成長度和str字串一樣的陣列dp,dp[i]值的含義為str[o .. i]中必須以字元str[i]結
* 尾的最長的有效括號子串長度。那麼dp[i]值可以按如下方式求解:
* 1. dp[o]=o。只含有乙個字元肯定不是有效括號字串, 長度自然是0。
* 2. 從左到右依次遍歷str[i .. n-1]的每個字元, 假設遍歷到str[i].
* 3. 如果str[i]="(", 有效括號字串必然是以")"結尾, 而不是以"("結尾,所以dp[i]= 0。
* 4. 如果str[i]=")", 那麼以str[i]結尾的最長有效括號子串可能存在。dp[i-1]的值代表必
* 須以str[i-1]結尾的最長有效括號子串的長度,所以如果i-dp[i-1]-1位置上的字元是"(",
* 就能與當前位置的str[i]字元再配出一對有效括號。比如"(()())", 假設遍歷到最後乙個
* 字元")",必須以倒數第二個字元結尾的最長有效括號子串是"()()",找到這個子串之前的字
* 符,即i-dp[i-1]-1位置的字元,發現是"(" ,所以它可以和最後乙個字元再配出一對有效括
* 號。如果該情況發生, dp[i]的值起碼是dp[i-1]+2, 但還有一部分長度容易被人忽略。比
* 如"()(())",假設遍歷到最後乙個字元")",通過上面的過程找到的必須以最後字元結尾的最
* 長有效括號子串起碼是"(())",但是前面還有一段"()"可以和"(())"結合在一起構成更大的
* 有效括號子串。也就是說,str[i-dp[i-1]- 2]和str[i]配成了一對,這時還應該把
* dp[i-dp[i-1]-2]的值加到dp[i]中,這麼做表示把str[i-dp[i-1]-2]結尾的最長有效括號子
* 串接到前面, 才能得到以當前字元結尾的最長有效括號子串。
* 5. dp[ .. n-1]中的最大值就是最終的結果。
* * @author 雪瞳
* @slogan 時鐘尚且前行,人怎能再此止步!
* @function
* */
public class maxlength
char chars = string.tochararray();
int dp = new int[chars.length];
int pre = 0;
int res = 0;
for (int i=1;i=0 && "(".equals(chars[pre]))
}res = math.max(res,dp[i]);
}return res;
}}
每日一題 為了工作 2020 056 第六十四題
package com.swust.bit.example63.example64 問題 只用位運算完成整數的加法運算 分析 用位運算實現加法運算。如果在不考慮進製的情況下,a b就是正確結果,因為0加0為0 0 0 0加1為1 0 1 1加0為1 1 0 1加1為0 1 1 author 雪瞳 s...
每日一題 1
題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...
每日一題2018 3 21
leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...