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

數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)day9

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)day9。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目:187. 重復(fù)的DNA序列

解法1:哈希表

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        vector<string> ans;
        unordered_map<string, int> mp;
        int n=s.size(), L=10;
        for(int i=0; i<=n-L; ++i){	//從開頭遍歷到最后一個(gè)長(zhǎng)度為10的子串開頭
            string temp = s.substr(i,L);
            if(++mp[temp]==2){	//當(dāng)數(shù)量==2時(shí)即可加入答案序列
                ans.push_back(temp);
            }
        }
        return ans;
    }
};

解法2:哈希表+滑動(dòng)窗口+位運(yùn)算

好長(zhǎng),不想看

題目:5. 最長(zhǎng)回文子串

解法1:暴力解法

遍歷每一個(gè)子串,當(dāng)其是回文子串且長(zhǎng)度最大,存儲(chǔ)初始位置和長(zhǎng)度。
時(shí)間復(fù)雜度O(n^3),空間復(fù)雜度O(1)

class Solution {
public:
    bool isPalindrome(string s, int left, int right){	//判斷s字符串中l(wèi)eft到right位置的子串是否為回文串
        while(left<right){
            if(s[left] != s[right]) return false;
            ++left; --right;
        }
        return true;
    }

    string longestPalindrome(string s) {
        int n = s.size();
        if(n<2) return s;	//特判

        int maxLen = 1;	//最大長(zhǎng)度可以是一個(gè)字母
        int begin = 0;	//初始位置

        for(int i=0; i<n-1; ++i){	//遍歷頭,注意遍歷到n-1
            for(int j=i+1; j<n; ++j){	//遍歷從i開始的子串的尾,
                if(j-i+1>maxLen && isPalindrome(s, i, j)){	//當(dāng)子串長(zhǎng)度大于當(dāng)前最大長(zhǎng)度,且子串為回文串
                    maxLen = j-i+1;	//更新最大長(zhǎng)度
                    begin = i;	//更新起始位置
                }
            }
        }

        return s.substr(begin, maxLen);	//返回s的最大長(zhǎng)度回文子串
    }
};

解法2:動(dòng)態(tài)規(guī)劃

相當(dāng)于在暴力解法的基礎(chǔ)上空間換時(shí)間,時(shí)間復(fù)雜度O(n^2),空間復(fù)雜度O(n)
狀態(tài)定義(定義子問題):一個(gè)字符串是否是回文串看去掉兩頭字符后的字符串是否是回文串,因此子問題定義為:dp[i][j]表示s[i,...,j]為回文子串
狀態(tài)轉(zhuǎn)移方程(描述子問題之間的聯(lián)系)dp[i][j] = (s[i]==s[j]) && (dp[i+1][j-1]=true)
初始化:邊界條件就是當(dāng)子串長(zhǎng)度為1的時(shí)候,顯然是回文子串,比如,ij的一個(gè)子串在i和j位置的字符相同時(shí),判斷去掉ij位置字符后的子串長(zhǎng)度是否是回文子串,一致判斷到去掉ij位置字符后的子串長(zhǎng)度小于2,即j-1-(i+1)+1<2 -> j-i<3
輸出dp[i][j]表示ij的子串是否是回文子串,判斷j-i+1是否大于maxLen,如果大于,記錄maxLenbegin=i
優(yōu)化空間:見解法3中心拓展法
PS:注意都是先確定起始位置和長(zhǎng)度,最后再截取最長(zhǎng)回文子串
數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)day9,LeetCode,數(shù)據(jù)結(jié)構(gòu),算法,動(dòng)態(tài)規(guī)劃

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if(n<2) return s;	//特判

        int maxLen = 1;	//最大回文子串長(zhǎng)度
        int begin = 0;	//最大回文子串起始位置

        vector<vector<int>> dp(n, vector<int>(n));	//dp定義,true是非0數(shù),false是0
        for(int i=0; i<n; ++i){	//初始定義,每個(gè)字符單獨(dú)都是回文子串,對(duì)角線為true
            dp[i][i] = true;
        }
        for(int j=1; j<n; ++j){	//從左上角開始遍歷,注意從1開始,先遍歷列
            for(int i=0; i<j; ++i){	//后遍歷行,到對(duì)角線(j)為止
                if(s[i]!=s[j]) dp[i][j]=false;	//如果i和j位置的字符不相同,則直接false
                else{	//i和j位置字符相同
                    if(j-i<3){  //邊界:j-1-(i+1)+1<2 -> j-i<3
                        dp[i][j] = true;
                    }else{	//繼續(xù)判斷i+1到j(luò)-1的子串
                        dp[i][j] = dp[i+1][j-1];
                    }
                }
                if(dp[i][j]==true && j-i+1>maxLen){	//檢查i到j(luò)子串長(zhǎng)度是否大于maxLen
                    maxLen = j-i+1;	//更新最大回文子串長(zhǎng)度
                    begin = i;	//更新最大回文子串初始位置
                }
            }
        }

        return s.substr(begin, maxLen);	//截取最長(zhǎng)回文子串
    }
};

解法3:中心擴(kuò)展法

時(shí)間復(fù)雜度:O(n^2),空間復(fù)雜度:O(1)
枚舉中心位置的個(gè)數(shù)2(n-1),每個(gè)中心向兩邊擴(kuò)散看是否為回文子串,偶數(shù)回文子串和奇數(shù)回文子串

class Solution {
public:
    int ExpandfromCentre(string s, int i, int j){	//從中心開始擴(kuò)展,檢查擴(kuò)展子串是否是回文子串
        int n = s.size();
        int left = i, right = j;
        while(left>=0 && right<n){
            if(s[left]==s[right]){
                --left;
                ++right;
            }else{
                break;
            }
        }   //不符合i和j位置的字符相同時(shí)退出循環(huán),因此返回的回文子串的長(zhǎng)度為j-1-(i+1)+1=j-i-1,這里是left和right?。?!
        return right-left-1;
    }

    string longestPalindrome(string s) {
        int n = s.size();
        if(n<2) return s;	//特判

        int maxLen = 1;	//最大回文子串長(zhǎng)度
        int begin = 0;	//最大回文子串起始位置

        for(int i=0; i<n-1; ++i){	//枚舉中心位置
            int oddLen = ExpandfromCentre(s, i, i);	//最大奇數(shù)回文子串長(zhǎng)度
            int evenLen = ExpandfromCentre(s, i, i+1);	//最大偶數(shù)回文子串長(zhǎng)度
            if(max(oddLen, evenLen) > maxLen){	//更新maxLen和begin
                maxLen = max(oddLen, evenLen);
                begin = i-(maxLen-1)/2;	//注意這里是推導(dǎo)出來(lái)的
            }
        }
        
        return s.substr(begin, maxLen);	//截取最長(zhǎng)回文子串
    }
};

從i和maxLen倒推begin有點(diǎn)麻煩,可以選另一個(gè)寫法:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-672305.html

class Solution {
public:
    pair<int, int> ExpandfromCentre(string s, int i, int j){	//注意函數(shù)類型是pair
        int n = s.size();
        int left = i, right = j;
        while(left>=0 && right<n){
            if(s[left]==s[right]){
                --left;
                ++right;
            }else{
                break;
            }
        }   //不符合i和j位置的字符相同時(shí)退出循環(huán),因此返回的回文子串的長(zhǎng)度為j-1-(i+1)+1=j-i-1,這里是left和right!??!
        return {left+1, right-1};	//注意返回值和{}
    }

    string longestPalindrome(string s) {
        int n = s.size();
        if(n<2) return s;	//特判

        int maxLen = 1;	//最大回文子串長(zhǎng)度
        int begin = 0;	//最大回文子串起始位置

        for(int i=0; i<n-1; ++i){
            auto [odd_l, odd_r] = ExpandfromCentre(s, i, i);	//注意加[]
            auto [even_l, even_r] = ExpandfromCentre(s, i, i+1);
            if(odd_r-odd_l+1 > maxLen){
                maxLen = odd_r-odd_l+1;
                begin = odd_l;
            }
            if(even_r-even_l+1 > maxLen){
                maxLen = even_r-even_l+1;
                begin = even_l;
            }
        }
        
        return s.substr(begin, maxLen);	//截取最長(zhǎng)回文子串
    }
};

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)day9的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 算法分析與設(shè)計(jì)考前沖刺 (算法基礎(chǔ)、數(shù)據(jù)結(jié)構(gòu)與STL、遞歸和分治、 動(dòng)態(tài)規(guī)劃、貪心算法、 回溯算法)

    算法分析與設(shè)計(jì)考前沖刺 算法基礎(chǔ) 算法是一系列解決問題的清晰指令,代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制。 程序是算法用某種程序設(shè)計(jì)語(yǔ)言的具體的 具體實(shí)現(xiàn) 算法特征: 有窮性(有限步) 確定性 輸入 輸出 可行性(有限時(shí)間) 算法的復(fù)雜性: 時(shí)間復(fù)雜性 和空間復(fù)

    2024年02月02日
    瀏覽(25)
  • 算法訓(xùn)練day9Leetcode232用棧實(shí)現(xiàn)隊(duì)列225用隊(duì)列實(shí)現(xiàn)棧

    https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 見我的博客 https://blog.csdn.net/qq_36372352/article/details/135470438?spm=1001.2014.3001.5501 在push數(shù)據(jù)的時(shí)候,只要數(shù)據(jù)放進(jìn)輸入棧就好,但在pop的時(shí)候,操作就復(fù)雜一些, 輸出棧如果為空,就把進(jìn)棧數(shù)據(jù)全部導(dǎo)

    2024年01月24日
    瀏覽(50)
  • 數(shù)據(jù)結(jié)構(gòu)day08(樹、算法)

    數(shù)據(jù)結(jié)構(gòu)day08(樹、算法)

    今日任務(wù): 二叉樹: 今日思維導(dǎo)圖 鏈接: 快排:快速排序法(詳解)_李小白~的博客-CSDN博客圖畫挺好啊 常見款:https://www.runoob.com/w3cnote/quick-sort.html ?

    2024年02月10日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)(day1)

    數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)(day1)

    (1)我是一個(gè)大三的學(xué)生(準(zhǔn)確來(lái)說應(yīng)該是準(zhǔn)大三,因?yàn)槊魈觳艌?bào)名哈哈哈)。 (2)最近就想每天閑著沒事也刷些C語(yǔ)言習(xí)題來(lái)鍛煉下編程水平,也一直在思考企業(yè)對(duì)應(yīng)屆大學(xué)生能力的要求,所以經(jīng)常會(huì)想到關(guān)于面試的事情。由于我也沒實(shí)習(xí)過,所以我對(duì)面試沒有一個(gè)具象化

    2024年02月10日
    瀏覽(15)
  • 數(shù)據(jù)結(jié)構(gòu)算法leetcode刷題練習(xí)(1)

    數(shù)據(jù)結(jié)構(gòu)算法leetcode刷題練習(xí)(1)

    給定一個(gè)三角形 triangle ,找出自頂向下的最小路徑和。 每一步只能移動(dòng)到下一行中相鄰的結(jié)點(diǎn)上。相鄰的結(jié)點(diǎn) 在這里指的是 下標(biāo) 與 上一層結(jié)點(diǎn)下標(biāo) 相同或者等于 上一層結(jié)點(diǎn)下標(biāo) + 1 的兩個(gè)結(jié)點(diǎn)。也就是說,如果正位于當(dāng)前行的下標(biāo) i ,那么下一步可以移動(dòng)到下一行的下標(biāo)

    2023年04月24日
    瀏覽(20)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】112、LeetCode路徑總和

    【算法與數(shù)據(jù)結(jié)構(gòu)】112、LeetCode路徑總和

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :本題通過計(jì)算根節(jié)點(diǎn)到葉子節(jié)點(diǎn)路徑上節(jié)點(diǎn)的值之和,然后再對(duì)比目標(biāo)值。利用文章【算法和數(shù)據(jù)結(jié)構(gòu)】257、LeetCode二叉樹的所有路徑中的遞歸算法。 這里要注意,默認(rèn)路徑之和是

    2024年02月11日
    瀏覽(28)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】62、LeetCode不同路徑

    【算法與數(shù)據(jù)結(jié)構(gòu)】62、LeetCode不同路徑

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :機(jī)器人只能向下或者向右移動(dòng),那么到達(dá)(i,j)位置的路徑和(i-1,j)以及(i,j-1)有關(guān)。那么我們就得到的動(dòng)態(tài)規(guī)劃的表達(dá)式 d p [ i ] [ j ] = d p [ i ? 1 ] [ j ] + d p [ i ] [ j ? 1 ] dp[i][

    2024年01月18日
    瀏覽(24)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】474、LeetCode一和零

    【算法與數(shù)據(jù)結(jié)構(gòu)】474、LeetCode一和零

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :本題要找strs數(shù)組的最大子集,這個(gè)子集最多含有 m m m 個(gè)0和 n n n 個(gè)1。本題也可以抽象成一個(gè)01背包的問題。其中,strs內(nèi)的元素就是物品,而 m m m 和 n n n 就是背包的維度。 d p [

    2024年01月22日
    瀏覽(26)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】343、LeetCode整數(shù)拆分

    【算法與數(shù)據(jù)結(jié)構(gòu)】343、LeetCode整數(shù)拆分

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :博主做這道題的時(shí)候一直在思考,如何找到 k k k 個(gè)正整數(shù), k k k 究竟為多少合適。從數(shù)學(xué)的邏輯上來(lái)說,將 n n n 均分為 k k k 個(gè)數(shù)之后, k k k 個(gè)數(shù)的乘積為最大(類似于相同周長(zhǎng)

    2024年01月17日
    瀏覽(23)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】494、LeetCode目標(biāo)和

    【算法與數(shù)據(jù)結(jié)構(gòu)】494、LeetCode目標(biāo)和

    所有的LeetCode題解索引,可以看這篇文章——【算法和數(shù)據(jù)結(jié)構(gòu)】LeetCode題解。 ?? 思路分析 :本題和這道題【算法與數(shù)據(jù)結(jié)構(gòu)】1049、LeetCode 最后一塊石頭的重量 II類似,同樣可以轉(zhuǎn)換成01背包問題。下面開始論述。假設(shè)添加正號(hào)的整數(shù)子集和為 p o s i t i v e positive p os i t

    2024年01月20日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包