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

【程序員面試金典】面試題 17.13. 恢復(fù)空格

這篇具有很好參考價(jià)值的文章主要介紹了【程序員面試金典】面試題 17.13. 恢復(fù)空格。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

題目描述

描述:哦,不!你不小心把一個(gè)長(zhǎng)篇文章中的空格、標(biāo)點(diǎn)都刪掉了,并且大寫(xiě)也弄成了小寫(xiě)。像句子"I reset the computer. It still didn’t boot!“已經(jīng)變成了"iresetthecomputeritstilldidntboot”。在處理標(biāo)點(diǎn)符號(hào)和大小寫(xiě)之前,你得先把它斷成詞語(yǔ)。當(dāng)然了,你有一本厚厚的詞典dictionary,不過(guò),有些詞沒(méi)在詞典里。假設(shè)文章用sentence表示,設(shè)計(jì)一個(gè)算法,把文章斷開(kāi),要求未識(shí)別的字符最少,返回未識(shí)別的字符數(shù)。

注意:本題相對(duì)原題稍作改動(dòng),只需返回未識(shí)別的字符數(shù)

示例:

輸入:
dictionary = ["looked","just","like","her","brother"]
sentence = "jesslookedjustliketimherbrother"
輸出: 7
解釋?zhuān)?斷句后為"jess looked just like tim her brother",共7個(gè)未識(shí)別字符。

提示:

0 <= len(sentence) <= 1000
dictionary中總字符數(shù)不超過(guò) 150000。
你可以認(rèn)為dictionary和sentence中只包含小寫(xiě)字母。

解題思路

思路:最直觀的想法是,動(dòng)態(tài)規(guī)劃+字典樹(shù)。使用dp[i]表示長(zhǎng)度為i的字符串的最少未識(shí)別字符,如果下標(biāo)0i-1(長(zhǎng)度1i)之間未匹配,則dp[i]=dp[i-1]+1,反之如果下標(biāo)j-1i-1(長(zhǎng)度ji)之間發(fā)生匹配,則dp[i]=dp[j-1]+1,其中字典樹(shù)需要逆序構(gòu)建喔!

class Trie {
public:
	//下一個(gè)字母
    Trie* next[26];
    //該字符是否是該單詞的結(jié)束位置
    bool isEnd;
    //前綴樹(shù)類(lèi)的構(gòu)造函數(shù)
    Trie(){
        isEnd=false;
        memset(next,0,sizeof(next));
    }
    //向字典樹(shù)中插入單詞(可根據(jù)需求選擇正序或者逆序插入)
    void insert(string s)
    {
        //逆序插入
        Trie* curPos=this;
        for(int i=s.size()-1;i>=0;i--)
        {
            int t=s[i]-'a';
            if(curPos->next[t]==nullptr)
                curPos->next[t]=new Trie();
            curPos=curPos->next[t];
        }
        curPos->isEnd=true;
    }
};
class Solution {
public:
    int respace(vector<string>& dictionary, string sentence) {
        int n=sentence.size();
        int m=dictionary.size();
        //創(chuàng)建字典樹(shù)對(duì)象 使用指針root指向該對(duì)象
        Trie* root=new Trie();
        //構(gòu)建字典樹(shù)
        for(auto dic:dictionary)
        {
            root->insert(dic);
        }
        //dp[i]表示以長(zhǎng)度為i結(jié)尾的最少未識(shí)別字符
        vector<int> dp(n+1,INT_MAX);
        //長(zhǎng)度為0的字符串未識(shí)別的為0
        dp[0]=0;
        //i表示第幾個(gè)字符
        for(int i=1;i<=n;i++)
        {
            dp[i]=dp[i-1]+1;
            Trie* curPos=root;
            //j表示第幾個(gè)字符
            for(int j=i;j>=1;j--)
            {
                //字符對(duì)應(yīng)的下標(biāo)
                int t=sentence[j-1]-'a';
                //如果當(dāng)前字符在字典樹(shù)中不存在則直接退出
                if(curPos->next[t]==nullptr)
                    break;
                //如果當(dāng)前字符在字典樹(shù)中且已經(jīng)結(jié)束則求取最小長(zhǎng)度
                else if(curPos->next[t]->isEnd) 
                    dp[i]=min(dp[i],dp[j-1]);
                curPos=curPos->next[t];
            }
        }
        return dp[n];
    }
};

總結(jié):注意字典樹(shù)的數(shù)據(jù)結(jié)構(gòu)編寫(xiě)方式?。?!root->insert?。?!

字典樹(shù)介紹

  1. 實(shí)現(xiàn) Trie (前綴樹(shù))

前綴樹(shù) 是一種樹(shù)形數(shù)據(jù)結(jié)構(gòu),用于高效地存儲(chǔ)和檢索字符串?dāng)?shù)據(jù)集中的鍵。這一數(shù)據(jù)結(jié)構(gòu)有相當(dāng)多的應(yīng)用情景,例如自動(dòng)補(bǔ)完和拼寫(xiě)檢查。

請(qǐng)你實(shí)現(xiàn) Trie 類(lèi):

Trie() 初始化前綴樹(shù)對(duì)象。
void insert(String word) 向前綴樹(shù)中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前綴樹(shù)中,返回 true(即,在檢索之前已經(jīng)插入);否則,返回 false 。
boolean startsWith(String prefix) 如果之前已經(jīng)插入的字符串 word 的前綴之一為 prefix ,返回 true ;否則,返回 false 。

示例:

輸入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
輸出
[null, null, true, false, true, null, true]

解釋
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

提示:

1 <= word.length, prefix.length <= 2000
word 和 prefix 僅由小寫(xiě)英文字母組成
insert、search 和 startsWith 調(diào)用次數(shù) 總計(jì) 不超過(guò) 3 * 104 次

思路:最直觀的想法是,字典樹(shù)。字典樹(shù),一次建樹(shù),多次查詢(xún)。

class Trie {
private:
    bool isEnd; //標(biāo)記是否為單詞結(jié)尾
    Trie* next[26]; //標(biāo)記下一個(gè)節(jié)點(diǎn)可能是什么 分別是a,b,c,d...
public:
    Trie() {
        isEnd=false;
        memset(next,0,sizeof(next));
    }
    void insert(string word) {
        //首先指向當(dāng)前這棵樹(shù)
        Trie* node=this;
        //遍歷單詞
        for(char c:word)
        {
            //如果對(duì)應(yīng)為空則新建
            if(node->next[c-'a']==NULL)
                node->next[c-'a']=new Trie();
            //然后將節(jié)點(diǎn)指向當(dāng)前(為下一次準(zhǔn)備)
            node=node->next[c-'a'];
        }
        //置單詞結(jié)束標(biāo)志
        node->isEnd=true;
    }
    bool search(string word) {
        //首先指向當(dāng)前這棵樹(shù)
        Trie* node=this;
        for(char c:word)
        {
            node=node->next[c-'a'];
            if(node==NULL)
                return false;
        }
        return node->isEnd;
    }
    bool startsWith(string prefix) {
        //首先指向當(dāng)前這棵樹(shù)
        Trie* node=this;
        for(char c:prefix)
        {
            node=node->next[c-'a'];
            if(node==NULL)
                return false;
        }
        return true;
    }
};

總結(jié):字典樹(shù)一般用于單詞查找和前綴匹配。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-500508.html

到了這里,關(guān)于【程序員面試金典】面試題 17.13. 恢復(fù)空格的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • 【程序員面試金典】面試題 17.25 . 單詞矩陣

    描述:給定一份單詞的清單,設(shè)計(jì)一個(gè)算法,創(chuàng)建由字母組成的面積最大的矩形,其中每一行組成一個(gè)單詞(自左向右),每一列也組成一個(gè)單詞(自上而下)。不要求這些單詞在清單里連續(xù)出現(xiàn),但要求所有行等長(zhǎng),所有列等高。 如果有多個(gè)面積最大的矩形,輸出任意一個(gè)均可

    2024年02月12日
    瀏覽(26)
  • 【程序員面試金典】面試題 17.14. 最小K個(gè)數(shù)

    描述:設(shè)計(jì)一個(gè)算法,找出數(shù)組中最小的k個(gè)數(shù)。以任意順序返回這k個(gè)數(shù)均可。 示例: 提示: 0 = len(arr) = 100000 0 = k = min(100000, len(arr)) 思路:最直觀的想法是,排序。 擴(kuò)展:最大堆。最小的k個(gè)數(shù),那么就可以維持一個(gè)大小為k的最大堆,先填充k個(gè)數(shù)到最大堆中,然后再依次遍

    2024年02月11日
    瀏覽(18)
  • 【程序員面試金典】面試題 17.19. 消失的兩個(gè)數(shù)字

    描述:給定一個(gè)數(shù)組,包含從 1 到 N 所有的整數(shù),但其中缺了兩個(gè)數(shù)字。你能在 O(N) 時(shí)間內(nèi)只用 O(1) 的空間找到它們嗎? 以任意順序返回這兩個(gè)數(shù)字均可。 示例 1: 示例 2: 提示: nums.length = 30000 思路:最直觀的想法是,位運(yùn)算。消失的兩個(gè)數(shù)字和只出現(xiàn)一次的兩個(gè)元素,本質(zhì)

    2024年02月12日
    瀏覽(26)
  • 【程序員面試金典】面試題 17.21. 直方圖的水量

    【程序員面試金典】面試題 17.21. 直方圖的水量

    描述:給定一個(gè)直方圖(也稱(chēng)柱狀圖),假設(shè)有人從上面源源不斷地倒水,最后直方圖能存多少水量?直方圖的寬度為 1。 上面是由數(shù)組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方圖,在這種情況下,可以接 6 個(gè)單位的水(藍(lán)色部分表示水)。 感謝 Marcos 貢獻(xiàn)此圖。 示例: 思路:最直觀的想

    2024年02月11日
    瀏覽(15)
  • 《程序員面試金典(第6版)面試題 16.10. 生存人數(shù)(前綴和思想)

    《程序員面試金典(第6版)面試題 16.10. 生存人數(shù)(前綴和思想)

    給定 N 個(gè)人的出生年份和死亡年份,第 i 個(gè)人的出生年份為 birth[i],死亡年份為 death[i],實(shí)現(xiàn)一個(gè)方法以計(jì)算生存人數(shù)最多的年份。 你可以假設(shè)所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之間。如果一個(gè)人在某一年的任意時(shí)期處于生存狀態(tài),那么他應(yīng)該被納入那一年的

    2024年02月02日
    瀏覽(27)
  • 《程序員面試金典(第6版)》 面試題 08.11. 硬幣(動(dòng)態(tài)規(guī)劃,組合問(wèn)題,C++)

    《程序員面試金典(第6版)》 面試題 08.11. 硬幣(動(dòng)態(tài)規(guī)劃,組合問(wèn)題,C++)

    硬幣。給定數(shù)量不限的硬幣,幣值為25分、10分、5分和1分,編寫(xiě)代碼計(jì)算n分有幾種表示法。(結(jié)果可能會(huì)很大,你需要將結(jié)果模上1000000007) 示例1: 輸入: n = 5 輸出:2 解釋: 有兩種方式可以湊成總金額: 5=5 5=1+1+1+1+1 示例2: 輸入: n = 10 輸出:4 解釋: 有四種方式可以湊成總金額: 1

    2023年04月08日
    瀏覽(19)
  • 13個(gè)程序員常用開(kāi)發(fā)工具用途推薦整理

    作為一名剛?cè)腴T(mén)的程序員,選擇合適的開(kāi)發(fā)工具可以提高工作效率,加快學(xué)習(xí)進(jìn)度。在本文中,我將向您推薦10個(gè)常用的開(kāi)發(fā)工具,并通過(guò)簡(jiǎn)單的例子和代碼來(lái)介紹它們的主要用途。 Visual Studio Code(VSCode)是一個(gè)免費(fèi)、開(kāi)源且跨平臺(tái)的代碼編輯器,支持多種編程語(yǔ)言。它具有

    2024年02月07日
    瀏覽(56)
  • 讀程序員的制勝技筆記13_安全審查(上)

    讀程序員的制勝技筆記13_安全審查(上)

    5.6.1.1.?任何你不想丟失或泄露的東西都是資產(chǎn),包括你的源代碼、設(shè)計(jì)文檔、數(shù)據(jù)庫(kù)、私鑰、API令牌、服務(wù)器配置,還有Netflix觀看清單 5.6.2.1.?每臺(tái)服務(wù)器都會(huì)被一些人訪問(wèn),而每臺(tái)服務(wù)器都會(huì)訪問(wèn)其他一些服務(wù)器 6.1.1.1.?設(shè)計(jì)時(shí)首先要考慮到安全問(wèn)題,因?yàn)樵诩扔谢A(chǔ)上去

    2024年02月05日
    瀏覽(23)
  • 讀程序員的README筆記13_技術(shù)設(shè)計(jì)流程(上)

    讀程序員的README筆記13_技術(shù)設(shè)計(jì)流程(上)

    3.4.1.1.?外界干擾是深度工作的“殺手” 3.4.1.2.?避免所有的交流方式 3.4.1.2.1.?關(guān)閉聊天 3.4.1.2.2.?關(guān)閉電子郵件 3.4.1.2.3.?禁用電話通知 3.4.1.2.4.?換個(gè)地方坐 3.4.2.1.?有形產(chǎn)出是一份設(shè)計(jì)文檔 4.2.3.1.?如果有一個(gè)以上的問(wèn)題,詢(xún)問(wèn)哪些問(wèn)題是最優(yōu)先的 4.3.7.1.?注意與外人交流時(shí)不

    2024年02月04日
    瀏覽(53)
  • 讀程序員的README筆記17_構(gòu)建可演進(jìn)的架構(gòu)(下)

    讀程序員的README筆記17_構(gòu)建可演進(jìn)的架構(gòu)(下)

    1.3.3.1.?開(kāi)發(fā)人員可以只專(zhuān)注于和自己相關(guān)的字段,因?yàn)樗鼈儠?huì)繼承其他字段的默認(rèn)值 1.3.3.2.?默認(rèn)值可使大型API在感覺(jué)上很小巧 1.4.1.1.?OpenAPI通常用于RESTful服務(wù) 1.4.1.2.?non-REST服務(wù)則使用Protocol Buffers、Thrift或類(lèi)似的接口定義語(yǔ)言(interface definition language,IDL) 1.4.1.3.?接口定義工

    2024年02月04日
    瀏覽(50)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包