每日一題 為了工作 2020 0501 第六十題

2022-07-24 06:00:15 字數 1473 閱讀 2864

/**

* * 問題:括號字串的最長有效長度

* 給定乙個括號字串返回最長的有效字串子串

* * 分析:

* 用動態規劃求解,可以做到時間複雜度為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...