国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動態(tài)規(guī)劃)

這篇具有很好參考價值的文章主要介紹了Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動態(tài)規(guī)劃)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

  • Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動態(tài)規(guī)劃)
  • 題目
    • 給你一個二進(jìn)制字符串 s ,你需要將字符串分割成一個或者多個 子字符串 ,使每個子字符串都是 美麗 的。
    • 如果一個字符串滿足以下條件,我們稱它是 美麗 的:
      • 它不包含前導(dǎo) 0 。
      • 它是 5 的冪的 二進(jìn)制 表示。
    • 請你返回分割后的子字符串的 最少 數(shù)目。如果無法將字符串 s 分割成美麗子字符串,請你返回 -1 。
    • 子字符串是一個字符串中一段連續(xù)的字符序列。
    • 1 <= s.length <= 15
    • s[i] 要么是 ‘0’ 要么是 ‘1’ 。
  • 解法
    • 動態(tài)規(guī)劃:首先第一位為 0 一定有前導(dǎo) 0,
    • 定義狀態(tài)(子問題):dp[i] 下標(biāo) i 前面結(jié)束,最少可以分割成多少美麗子字符串
    • 定義轉(zhuǎn)移方程:當(dāng)前為 1 前面才可以分割,然后當(dāng) [i,j] 以及 [j+1,n+1)均符合要求時 dp[i] = min(dp[j + 1] + 1)
    • 設(shè) m 為 5 次冪的個數(shù),n 為 s.length(n),時間復(fù)雜度:O(n ^ 2),空間復(fù)雜度:O(n + m)
  • 代碼
    /**
     * 動態(tài)規(guī)劃:首先第一位為 0 一定有前導(dǎo) 0,
     * 定義狀態(tài)(子問題):dp[i] 下標(biāo) i 前面結(jié)束,最少可以分割成多少美麗子字符串
     * 定義轉(zhuǎn)移方程:當(dāng)前為 1 前面才可以分割,然后當(dāng) [i,j] 以及 [j+1,n+1)均符合要求時 dp[i] = min(dp[j + 1] + 1)
     * 設(shè) m 為 5 次冪的個數(shù),n 為 s.length(n),時間復(fù)雜度:O(n ^ 2),空間復(fù)雜度:O(n + m)
     */
    private int solution2(String s) {
        // 第一位為 0 一定有前導(dǎo) 0
        if (s.charAt(0) == '0') {
            return -1;
        }

        // 定義狀態(tài)(子問題),多加一位方便計算
        int[] dp = new int[s.length() + 1];

        // 初始化
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[s.length()] = 0;

        // 將符合要求的 5 的次冪放入集合
        Set<Integer> beautifulSet = setBeautifulSet();

        // 定義轉(zhuǎn)移方程
        doMinimumBeautifulSubstrings(s, beautifulSet, dp);

        return dp[0] == Integer.MAX_VALUE ? -1 : dp[0];
    }

    /**
     * 將符合要求的 5 的次冪放入集合
     */
    private Set<Integer> setBeautifulSet() {
        Set<Integer> beautifulSet = new HashSet<>();

        int beautifulNum = 1;
        for (int i = 0; i < 7; i++) {
            beautifulSet.add(beautifulNum);
            beautifulNum *= 5;
        }

        return beautifulSet;
    }

    /**
     * 定義轉(zhuǎn)移方程
     */
    private void doMinimumBeautifulSubstrings(String s, Set<Integer> beautifulSet, int[] dp) {
        for (int i = s.length() - 1; i >= 0; i--) {

            // 當(dāng)前為 1 前面才可以分割
            if (s.charAt(i) == '1') {
                int num = 0;

                // 當(dāng) [i,j] 以及 [j+1,n+1)均符合要求時 dp[i] = min(dp[j + 1] + 1)
                for (int j = i; j < s.length(); j++) {
                    // 計算 [i,j)二進(jìn)制代表的數(shù)
                    num = (num << 1) + s.charAt(j) - '0';

                    if (dp[j + 1] != Integer.MAX_VALUE && beautifulSet.contains(num)) {
                        dp[i] = Math.min(dp[i], dp[j + 1] + 1);
                    }
                }
            }
//            System.out.println(i + " : " + dp[i]);
        }
    }

文章來源地址http://www.zghlxwxcb.cn/news/detail-556622.html

到了這里,關(guān)于Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動態(tài)規(guī)劃)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【力扣周賽】第 113 場雙周賽(貪心&異或性質(zhì)&換根DP)

    【力扣周賽】第 113 場雙周賽(貪心&異或性質(zhì)&換根DP)

    https://leetcode.cn/contest/biweekly-contest-113/ https://leetcode.cn/problems/minimum-right-shifts-to-sort-the-array/ 提示: 1 = nums.length = 100 1 = nums[i] = 100 nums 中的整數(shù)互不相同。 因為數(shù)據(jù)范圍很小,所以可以從小到大枚舉可能的答案。 https://leetcode.cn/problems/minimum-array-length-after-pair-removals/ 提示: 1

    2024年02月07日
    瀏覽(54)
  • 第 107 場LeetCode雙周賽

    第 107 場LeetCode雙周賽

    A 最大字符串配對數(shù)目 顯然各字符串對 間匹配的先后順序不影響最大匹配數(shù)目, 可以從后往前遍歷數(shù)組, 判斷前面是否有和當(dāng)前末尾構(gòu)成匹配的. B 構(gòu)造最長的新字符串 記憶化搜索: 定義狀態(tài) p a a , b b , a b , l a s t p_{aa,bb,ab,last} p aa , bb , ab , l a s t ? 為剩余三種字符串分別為aa、

    2024年02月11日
    瀏覽(22)
  • LeetCode---121雙周賽---數(shù)位dp

    LeetCode---121雙周賽---數(shù)位dp

    2996. 大于等于順序前綴和的最小缺失整數(shù) 2997. 使數(shù)組異或和等于 K 的最少操作次數(shù) 2998. 使 X 和 Y 相等的最少操作次數(shù) 2999. 統(tǒng)計強大整數(shù)的數(shù)目 簡單的模擬題,只要按照題目的要求去寫代碼即可,代碼如下 這題考異或的性質(zhì)---相同為0,相異為1,我們只要關(guān)心nums的異或和與

    2024年01月22日
    瀏覽(20)
  • leetcode 122雙周賽 解題思路+代碼

    本人水平有限,只做出3道,最后1道放棄。 給你一個長度為 n 的整數(shù)數(shù)組 nums 。 一個數(shù)組的 代價 是它的 第一個 元素。比方說,[1,2,3] 的代價是 1 ,[3,4,1] 的代價是 3 。 你需要將 nums 分成 3 個 連續(xù)且沒有交集 的子數(shù)組。 請你返回這些子數(shù)組的 最小 代價 總和 。 示例 1: 輸

    2024年02月20日
    瀏覽(20)
  • 第 122 場 LeetCode 雙周賽題解

    第 122 場 LeetCode 雙周賽題解

    A 將數(shù)組分成最小總代價的子數(shù)組 I 枚舉:枚舉后兩個子數(shù)組的起始下標(biāo) B 判斷一個數(shù)組是否可以變?yōu)橛行?模擬:模擬冒泡排序的過程,若相鄰元素大小關(guān)系需要交換位置,但其二進(jìn)制下數(shù)位為 1 的數(shù)目不同,則返回false,若完成排序返回true C 通過操作使數(shù)組長度最小 腦筋急

    2024年01月22日
    瀏覽(24)
  • LeetCode 雙周賽 106(2023/06/10)兩道思維題

    本文已收錄到 AndroidFamily,技術(shù)和職場問題,請關(guān)注公眾號 [彭旭銳] 加入知識星球提問。 往期回顧:LeetCode 單周賽第 348 場 · 數(shù)位 DP 模版學(xué)會了嗎? T1. 判斷一個數(shù)是否迷人(Easy) 標(biāo)簽:計數(shù) T2. 找到最長的半重復(fù)子字符串(Medium) 標(biāo)簽:同向雙指針 T3. 移動機(jī)器人(Medi

    2024年02月08日
    瀏覽(23)
  • ( 字符串) 205. 同構(gòu)字符串 ——【Leetcode每日一題】

    ( 字符串) 205. 同構(gòu)字符串 ——【Leetcode每日一題】

    難度:簡單 給定兩個字符串 s 和 t ,判斷它們是否是同構(gòu)的。 如果 s 中的字符可以按某種映射關(guān)系替換得到 t ,那么這兩個字符串是同構(gòu)的。 每個出現(xiàn)的字符都應(yīng)當(dāng)映射到另一個字符,同時不改變字符的順序。不同字符不能映射到同一個字符上,相同字符只能映射到同一個

    2024年02月02日
    瀏覽(65)
  • LeetCode_字符串_簡單_415.字符串相加

    給定兩個字符串形式的非負(fù)整數(shù) num1 和num2,計算它們的和并同樣以字符串形式返回。 你不能使用任何內(nèi)建的用于處理大整數(shù)的庫(比如 BigInteger), 也不能直接將輸入的字符串轉(zhuǎn)換為整數(shù)形式。 示例 1: 輸入:num1 = “11”, num2 = “123” 輸出:“134” 示例 2: 輸入:num1 = “

    2024年02月01日
    瀏覽(27)
  • LeetCode 雙周賽 103(2023/04/29)區(qū)間求和的樹狀數(shù)組經(jīng)典應(yīng)用

    本文已收錄到 AndroidFamily,技術(shù)和職場問題,請關(guān)注公眾號 [彭旭銳] 提問。 大家好,我是小彭。 這場周賽是 LeetCode 雙周賽第 103 場,難得在五一假期第一天打周賽的人數(shù)也沒有少太多。這場比賽前 3 題比較簡單,我們把篇幅留給最后一題。 往期周賽回顧:LeetCode 單周賽第

    2024年02月02日
    瀏覽(22)
  • (字符串 ) 459. 重復(fù)的子字符串——【Leetcode每日一題】

    (字符串 ) 459. 重復(fù)的子字符串——【Leetcode每日一題】

    難度:簡單 給定一個非空的字符串 s ,檢查是否可以通過由它的一個子串重復(fù)多次構(gòu)成。 示例 1: 輸入: s = “abab” 輸出: true 解釋: 可由子串 “ab” 重復(fù)兩次構(gòu)成。 示例 2: 輸入: s = “aba” 輸出: false 示例 3: 輸入: s = “abcabcabcabc” 輸出: true 解釋: 可由子串 “abc” 重復(fù)四次構(gòu)

    2024年02月07日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包