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

【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù)

這篇具有很好參考價值的文章主要介紹了【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

2645. 構造有效字符串的最少插入數(shù)

【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù),LeetCode,leetcode,動態(tài)規(guī)劃,散列表

方法一:計算組數(shù)

1.用count統(tǒng)計,能構成幾組abc

2.如果當前字符大于之前字符,說明還在組內(nèi),不更新

3.如果當前字符小于等于之前字符,說明不是同一組的abc,組數(shù)更新

4.最終返回值:組數(shù)*3,再減去原本的字符數(shù),就是要插入的次數(shù)

    //2645. 構造有效字符串的最少插入數(shù)---計算組數(shù)
    public int addMinimum2(String word) {
        int n = word.length();
        int count = 1;
        //最終構成abc的組數(shù)
        for (int i = 1; i < n; i++) {
            if (word.charAt(i - 1) >= word.charAt(i)) {
                //當前字符小于等于之前字符
                count++;
                //組數(shù)加一
            }
        }
        return count*3-n;
        //返回最終構成abc的總數(shù)-原本字符,即為要插入的次數(shù)
    }
方法二:動態(tài)規(guī)劃

1.從1開始,d[i]為前i個字符拼成abc需要的最小插入數(shù)

2.情況一:word[i]單獨存在于一組abc中,需要插兩次,才能組成abc.插入次數(shù)為之前的次數(shù)+2

3.情況二:當前字符比前一個字符大,需要插一次,就可以組成abc.修改當前插入次數(shù)為:之前的次數(shù)-1,因為之前插入的兩次中已經(jīng)包含了當前字符。

    public int addMinimum(String word) {
        int n = word.length();
        int[] d = new int[n + 1];
        //d[]數(shù)組用來統(tǒng)計,1到n的插入次數(shù)
        //從1開始,d[i]為前i個字符拼成abc需要的最小插入數(shù)。
        for (int i = 1; i <= n; i++) {
            d[i] = d[i - 1] + 2;
            //word[i]單獨存在于一組abc中,在之前情況的基礎上+2. eg: a+bc / b+ac / c+ab
            if (i > 1 && word.charAt(i - 1) > word.charAt(i - 2)) {
                //如果當前字符比前一個字符大,eg:ab/ ac / bc
                d[i] = d[i - 1] - 1;
                //當前字符和之前的字符在同一個abc中,重新覆蓋d[i],前一個位置的插入數(shù)-1
            }
        }
        return d[n];
    }

方法三: 考慮相鄰字母

1.設當前字符為x,前一個字符為y,

2.x大于y的情況:x-y-1

3.x小于等于y的情況:(x-y-1+3)mod 3 ,將計算的結果控制在0-2之間

4.開頭的單獨一個字符:word[0]-‘a(chǎn)’ ,結尾的一個字符:‘c’-word[n-1],合并為word[0]-word[n-1]+2

    public int addMinimum3(String word) {
        int n = word.length();
        int res = word.charAt(0) - word.charAt(n - 1) + 2;
        //合并處理開頭和結尾的情況
        for (int i = 1; i < n; i++) {
            res += (word.charAt(i) - word.charAt(i - 1) + 2) % 3;
        }
        return res;
    }

1-11 生日快樂

2085. 統(tǒng)計出現(xiàn)過一次的公共字符串

【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù),LeetCode,leetcode,動態(tài)規(guī)劃,散列表

思路:哈希表計算

1.用兩個哈希表分別統(tǒng)計word1和word2中字符出現(xiàn)的次數(shù)

2.遍歷words1中的每個單詞x,并使用count1.put(x,count1.getOrDefault(x,0)+1)將單詞x作為鍵,將其在count1中對應的值加1存儲起來,count1.getOrDefault(x,0)表示獲取count1中鍵為x的值,如果不存在則返回默認值0。

3.同理遍歷word2,同樣操作

4.遍歷count1的鍵集合count1.keySet(),對于每個鍵x,判斷count1.get(x)是否等于1且count2.getOrDefault(x,0)是否等于1。如果滿足條件,則將res加1。

    public int countWords(String[] words1, String[] words2) {
        Map<String,Integer> count1 = new HashMap<>();
        Map<String,Integer> count2 = new HashMap<>();
        //存儲每個單詞在對應數(shù)組中出現(xiàn)的次數(shù)
        for (String x:
             words1 ) {
            // 遍歷第一個字符串數(shù)組words1,將單詞及其出現(xiàn)次數(shù)存儲到count1中
            count1.put(x,count1.getOrDefault(x,0)+1);
        }
        for (String x:
                words2 ) {
            // 遍歷第二個字符串數(shù)組words2,將單詞及其出現(xiàn)次數(shù)存儲到count2中
            count2.put(x,count2.getOrDefault(x,0)+1);
        }
        int res = 0;
        //記錄相同單詞的數(shù)量
        for (String x:
             count1.keySet()) {
            // 遍歷count1的鍵集合,判斷在count1中出現(xiàn)次數(shù)為1且在count2中也出現(xiàn)次數(shù)為1的單詞
            if (count1.get(x)==1&&count2.getOrDefault(x,0)==1){
                res++;
            }
        }
        return res;
    }

2807. 在鏈表中插入最大公約數(shù)

【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù),LeetCode,leetcode,動態(tài)規(guī)劃,散列表

思路:模擬

1.調(diào)用函數(shù)求出要插入的最大公約數(shù)

2.插入到cur的后面

3.因為插了一位,所以移動兩個位置


    public ListNode insertGreatestCommonDivisors(ListNode head) {
        ListNode cur = head;
        while (cur.next!=null){
            int gcdVal = gcd(cur.val,cur.next.val);
            //調(diào)用函數(shù)求出要插入的最大公約數(shù)
            cur.next = new ListNode(gcdVal,cur.next);
            //插入到cur的后面
            cur = cur.next.next;
            //因為插了一位,所以移動兩個位置
        }
        return head;
    }

    /**
     * 求兩個結點值的最大公約數(shù)
     * @param a
     * @param b
     * @return
     */
    private int gcd(int a,int b){
        //求最大公約數(shù)有多種寫法
        while (a!=0){
            int temp = a;
            a = b % a;
            b = temp;
        }
        return b;
    }

求最大公約數(shù)的幾種方法:

1.暴力枚舉法

    public static int gcd(int a, int b) {
        int min = a < b ? a : b;//判斷并取出兩個數(shù)中小的數(shù)
        for (int i = min; i >= 1; i--) { //循環(huán),從最小值開始,依次遞減,直到i=1
            if (a%i==0&&b%i==0){    //當i能同時被A和B余盡時,返回i
                return i;
            }
        }
        return 0;
    }

}

2.輾轉(zhuǎn)相除法

 public static int gcd(int a, int b) {// 輾轉(zhuǎn)相除法
        int c = a % b;   //先將a對b取余
        while (c != 0) {   //當余數(shù)不等于0時,一直進行循環(huán),直到余數(shù)等于0,公約數(shù)就為b
            a = b;         //將a對b的余數(shù)再對b取余,直到循環(huán)結束
            b = c;
            c = a % b;
        }
        return b;
    }

3.輾轉(zhuǎn)相除法 —遞歸調(diào)用

    public static int gcd(int a, int b) {// 輾轉(zhuǎn)相除法 改進,調(diào)用函數(shù)遞歸
        int max = a > b ? a : b; //求出大的數(shù)
        int min = a < b ? a : b; //求出小的數(shù)
        if(max%min==0){
            return min;      //當大數(shù)模小數(shù)能余盡時,最大公約數(shù)就是小的數(shù)
        }
        return gcd(max%min,min);//遞歸函數(shù),參數(shù)去前兩個數(shù)的余數(shù),和小的數(shù)

4.輾轉(zhuǎn)相除法 —遞歸調(diào)用—簡化寫法

public static int gcd(int a, int b) {// 輾轉(zhuǎn)相除法 改進,調(diào)用函數(shù)遞歸
        return (a % b == 0) ? b : gcd(b, a%b );// 相同思路,三元運算/簡化寫法
    }

1.如果a余b等于0,說明b就是最大公約數(shù)

2.否則,進行遞歸,b代替曾經(jīng)的a,讓a%b產(chǎn)生的余數(shù)代替曾經(jīng)的b。

3.始終確保大數(shù)%小數(shù)

4.即使b位置上是值大于a, b代替a后,a(小數(shù))%b(大數(shù)) = a ,相當于替換位置

  1. (b,a%b)的位置不能交換,否則無法跳出遞歸

5.調(diào)用函數(shù)遞歸 更相減損法

 public static int gcd(int a, int b) {//調(diào)用函數(shù)遞歸 更相減損法
        int max = a>b?a:b;
        int min = a<b?a:b;
        if(max%min==0){
            return min;
        }
        return gcd(max-min,min);//相同思路,將%改為-,優(yōu)化速度
    }

6.調(diào)用函數(shù)遞歸 更相減損法–簡化

    public static int gcd(int a, int b) {//調(diào)用函數(shù)遞歸 更相減損法 簡易寫法
        if (a < b) {
            int tmp = a;
            a = b;
            b = tmp;
        }
        return (a % b == 0) ? b : gcd(a - b, b);
    

簡化不用找大小數(shù),把大數(shù)放到前面

因為小數(shù)減大數(shù)為負數(shù),所以要把大數(shù)替換到前面,

    public static int gcd5(int a, int b) {//調(diào)用函數(shù)遞歸 更相減損法 簡易寫法
        return (a % b == 0) ? b : a > b ? gcd5(a - b, b) : gcd5(b-a,a);
    }

壓行寫法,就是三目嵌套,就是可讀性不高

點擊移步博客主頁,歡迎光臨~

【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù),LeetCode,leetcode,動態(tài)規(guī)劃,散列表文章來源地址http://www.zghlxwxcb.cn/news/detail-848502.html

到了這里,關于【LeetCode題解】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)+2085. 統(tǒng)計出現(xiàn)過一次的公共字符串(哈希表)+2807. 在鏈表中插入最大公約數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • leetcode-2645 構造有效字符串的最小插入數(shù)

    題目鏈接 2645. 構造有效字符串的最少插入數(shù) - 力扣(LeetCode) 解題思路 動態(tài)規(guī)劃 1、定義狀態(tài)d[i]為將前i個字符(為了方便編碼,下標從1開始)拼湊成若干個abc所需要的最小插入數(shù)。那么初始狀態(tài)d[0]=0,最終要求解d[n],其中n為word的長度。 2、轉(zhuǎn)移過程 3、因為每個字符都盡

    2024年02月02日
    瀏覽(17)
  • 【力扣·每日一題】2645. 構造有效字符串的最小插入數(shù)(動態(tài)規(guī)劃 貪心 滾動數(shù)組優(yōu)化 C++ Go)

    題目鏈接 給你一個字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母數(shù)。 如果字符串可以由 “abc” 串聯(lián)多次得到,則認為該字符串 有效 。 提示: 1 = w o r d . l e n g t h = 50 1 = word.length = 50 1 = w or d . l e n g t h = 50 w

    2024年01月16日
    瀏覽(26)
  • 算法第十七天-構造有效字符串的最少插入數(shù)

    算法第十七天-構造有效字符串的最少插入數(shù)

    考慮abc的個數(shù) 假設答案有n個\\\"abc\\\"組成,那么需要插入的字符個數(shù)為 3 ? n ? l e n ( s ) 3*n - len(s) 3 ? n ? l e n ( s ) 。 對于相鄰的兩個字符x和y(x在y左側(cè)): 如果 x y xy x y ,那么x和y可以在同一個\\\"abc\\\"內(nèi),否則一定不在; 如果 x ≥ y xge y x ≥ y ,那么x和y一定不可以在同一個

    2024年01月17日
    瀏覽(21)
  • Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動態(tài)規(guī)劃)

    Leetcode 第 108 場雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動態(tài)規(guī)劃) 題目 給你一個二進制字符串 s ,你需要將字符串分割成一個或者多個 子字符串 ,使每個子字符串都是 美麗 的。 如果一個字符串滿足以下條件,我們稱它是 美麗 的: 它不包含前導 0 。 它是

    2024年02月15日
    瀏覽(23)
  • 【算法|動態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    【算法|動態(tài)規(guī)劃No.28】leetcode1312. 讓字符串成為回文串的最少插入次數(shù)

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學習過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進步。

    2024年02月06日
    瀏覽(22)
  • Leetcode 678. 有效的括號字符串

    有效的括號字符串 【問題描述】 給你一個只包含三種字符的字符串,支持的字符類型分別是 ‘(’、‘)’ 和 ‘*’。請你檢驗這個字符串是否為有效字符串,如果是有效字符串返回 true 。 有效字符串符合如下規(guī)則: 示例 1: 輸入:s = “()” 輸出:true 示例 2: 輸入:s = “

    2024年02月13日
    瀏覽(25)
  • 【LeetCode每日一題】2182. 構造限制重復的字符串

    【LeetCode每日一題】2182. 構造限制重復的字符串

    2024-1-13 2182. 構造限制重復的字符串 思路: 按照字符出現(xiàn)次數(shù)從高到低的順序進行重復,通過維護一個指針 j 來尋找下一個非零出現(xiàn)次數(shù)的字母。同時,利用 StringBuilder 對象可以高效地構建字符串,避免頻繁的字符串拼接操作 首先,創(chuàng)建一個長度為26的數(shù)組 cnt ,用于統(tǒng)計字

    2024年01月18日
    瀏覽(25)
  • python/c++ Leetcode題解——2744. 最大字符串配對數(shù)目

    我們可以直接使用二重循環(huán),枚舉給定的數(shù)組 words 中的 words[i] 和 words[j] 是否可以匹配。 由于題目規(guī)定了數(shù)組 words 中包含的字符串互不相同,因此在枚舉時,只要保證 ij,那么每個字符串最多匹配一次。 C++: python:

    2024年01月17日
    瀏覽(21)
  • 數(shù)據(jù)結構與算法之字符串: Leetcode 20. 有效的括號 (Typescript版)

    有效的括號 https://leetcode.cn/problems/valid-parentheses/ 描述 給定一個只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。 左括號必須以正確的順序閉合。 每個右括號都有一個對應的相

    2024年02月01日
    瀏覽(22)
  • 算法訓練day11Leetcode20有效的括號1047刪除字符串中所有相鄰重復項150逆波蘭表達式求值

    https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 判斷右括號后忘記pop 括號匹配是使用棧解決的經(jīng)典問題。 如果還記得編譯原理的話,編譯器在 詞法分析的過程中處理括號、花括號等這個符號的邏輯,也是使用了棧

    2024年01月17日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包