數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記(訓(xùn)練營四)-經(jīng)典面試22(ppt-8)

  • 判定一個由[a-z]字符構(gòu)成的字符串和一個包含'?'和''通配符的字符串是否匹配。 通配符'?'匹配任意單一字符,''匹配任意多個字符包括0個字符。 字符串長度不會超過100梨睁,字符串不為空障贸。
    輸入描述:
    字符串 str 和包含通配符的字符串 pattern擂错。1 <= 字符串長度 <= 100輸出描述: true 表示匹配,false 表示不匹配
/**
 * 判定一個由[a-z]字符構(gòu)成的字符串和一個包含'.'和'*'通配符的字符串是否匹配扁眯。
 * 通配符'.'匹配任意單一字符,'*'匹配任意多個字符包括0個字符。 字符串長度不
 * 會超過100翅帜,字符串不為空姻檀。
 * 輸入描述:
 * 字符串 str 和包含通配符的字符串 pattern。1 <= 字符串長度 <= 100輸出
 * 描述: true 表示匹配涝滴,false 表示不匹配
 */
public class IsMatch {

    // 暴力遞歸
    // 根據(jù)提議施敢,pattern匹配串中'*'能出現(xiàn)在開頭,且兩個'*'不能連續(xù)出現(xiàn)(挨在一起)
    public static boolean isMathch(String str,String pattern){
        char[] strC = str.toCharArray();
        char[] patternC = pattern.toCharArray();
        return isCheck(strC,patternC) && process(strC,0,patternC,0);
    }

    // 遞歸含義狭莱,pattern從pi開始一直到結(jié)尾僵娃,能不能匹配出str從si開始一直到結(jié)尾的字符串
    private static boolean process(char[] strC,int si,char[] patternC,int pi){
        if(pi == patternC.length){
            // 匹配串已經(jīng)沒有字符了,變成strC[si...],strC[i...]必須為空串
            return si == strC.length;
        }

        // 如果pi+1不是'*',si....一定要有字符腋妙,并且si,pi的字符必須相等
        if((pi+1 == patternC.length || patternC[pi+1] != '*') ){
           return process(strC,si+1,patternC,pi+1) && (strC.length != si)
                   &&  (strC[si] == patternC[pi] || patternC[pi] == '.');
        }
        // 如果pi+1等于'*'默怨,pi+2不是'*'
        // 假設(shè),pi ...pi+1,可以匹配si....開始的0個字符骤素,1個字符匙睹,兩個字符愚屁。。痕檬。(主要開si開始后面有幾個重復(fù)字符)

            // 如果si不是最后一個元素霎槐,且si一直等于pi,就一直匹配下去
         while ((strC.length != si) && (strC[si] == patternC[pi] || patternC[pi] == '.')){
             if(process(strC,si,patternC,pi+2)){
                 return true;
             }
             si++;
         }
        return process(strC,si,patternC,pi+2);
    }


    public static boolean dp(String str,String pattern){
        char[] strC = str.toCharArray();
        char[] patternC = pattern.toCharArray();
        if(!isCheck(strC,patternC)){
            return false;
        }
        int elen = patternC.length;
        int slen = strC.length;
        boolean[][] dp = new boolean[str.length()+1][patternC.length+1];
        // 最右下角的值為true
        dp[dp.length-1][dp[0].length-1] = true;
        // 每一個普遍位置依賴右下角和右邊隔一行

        // 最后一行
        // 空字符串,怎么通過pattern匹配出來
        // pattern必須滿足 ...a*a*a*

        for (int j = elen - 2; j > -1; j = j - 2) {
            if (patternC[j] != '*' && patternC[j + 1] == '*') {
                dp[slen][j] = true;
            } else {
                break;
            }
        }
        if (slen > 0 && elen > 0) {
            if ((patternC[elen - 1] == '.' || patternC[slen - 1] == patternC[elen - 1])) {
                dp[slen - 1][elen - 1] = true;
            }
        }

        for (int i = strC.length - 1; i > -1; i--) {
            for (int j = patternC.length - 2; j > -1; j--) {
                if (patternC[j + 1] != '*') {
                    dp[i][j] = (strC[i] == patternC[j] || patternC[j] == '.') && dp[i + 1][j + 1];
                } else {
                    int si = i;
                    while (si != strC.length && (strC[si] == patternC[j] || patternC[j] == '.')) {
                        if (dp[si][j + 2]) {
                            dp[i][j] = true;
                            break;
                        }
                        si++;
                    }
                    if (dp[i][j] != true) {
                        dp[i][j] = dp[si][j + 2];
                    }
                }
            }
        }

        return dp[0][0];
    }

    // 校驗(yàn)字符串是否合法
    private static boolean isCheck(char[] strC,char[] pattrenC){
        // str中不能包含匹配字符
        for (int i = 0; i < strC.length; i++) {
            if(strC[i] == '*' || strC[i] == '.'){
                return false;
            }
        }
        // 匹配串
        for (int i = 0; i < pattrenC.length; i++) {
            if(pattrenC[i] == '*' && (i == 0 || pattrenC[i-1] == '*')){
                return false;
            }
        }
        return true;
    }
}
  • 給定一個數(shù)組 arr梦谜,代表一排有分?jǐn)?shù)的氣球丘跌。每打爆一個氣球都能獲得分?jǐn)?shù),假設(shè)打爆氣 球 的分?jǐn)?shù)為 X唁桩,獲得分?jǐn)?shù)的規(guī)則如下: 1)如果被打爆氣球的左邊有沒被打爆的氣球闭树,找到離被打爆氣球最近的氣球,假設(shè)分?jǐn)?shù)為 L;如果被打爆氣球的右邊有沒被打爆的氣球荒澡,找到離被打爆氣球最近的氣球报辱,假設(shè)分?jǐn)?shù)為 R。 獲得分?jǐn)?shù)為 LXR单山。 2)如果被打爆氣球的左邊有沒被打爆的氣球碍现,找到離被打爆氣球最近的氣球,假設(shè)分?jǐn)?shù)為 L;如果被打爆氣球的右邊所有氣球都已經(jīng)被打爆米奸。獲得分?jǐn)?shù)為 LX鸵赫。 3)如果被打爆氣球的左邊所有的氣球都已經(jīng)被打爆;如果被打爆氣球的右邊有沒被打爆的 氣球,找到離被打爆氣球最近的氣球躏升,假設(shè)分?jǐn)?shù)為 R;如果被打爆氣球的右邊所有氣球都 已經(jīng) 被打爆辩棒。獲得分?jǐn)?shù)為 XR。 4)如果被打爆氣球的左邊和右邊所有的氣球都已經(jīng)被打爆膨疏。獲得分?jǐn)?shù)為 X一睁。
    目標(biāo)是打爆所有氣球,獲得每次打爆的分?jǐn)?shù)佃却。通過選擇打爆氣球的順序者吁,可以得到不同的總分,請返回能獲得的最大分?jǐn)?shù)饲帅。
    【舉例】
    arr = {3,2,5} 如果先打爆3复凳,獲得32;再打爆2,獲得25;最后打爆5灶泵,獲得5;最后總分21 如果先打爆3育八,獲得32;再打爆5,獲得25;最后打爆2赦邻,獲得2;最后總分18 如果先打爆2髓棋,獲得325;再打爆3,獲得35;最后打爆5,獲得5;最后總分50 如果先打爆2按声,獲得325;再打爆5膳犹,獲得35;最后打爆3,獲得3;最后總分48 如果先打爆5签则,獲得25;再打爆3须床,獲得32;最后打爆2,獲得2;最后總分18 如果先打爆5渐裂,獲得25;再打爆2豺旬,獲得32;最后打爆3,獲得3;最后總分19 返回能獲得的最大分?jǐn)?shù)為50
/**
 * 給定一個數(shù)組 arr芯义,代表一排有分?jǐn)?shù)的氣球。每打爆一個氣球都能獲得分?jǐn)?shù)妻柒,假設(shè)打爆氣 球 的分?jǐn)?shù)為 X扛拨,獲得分?jǐn)?shù)的
 * 規(guī)則如下: 1)如果被打爆氣球的左邊有沒被打爆的氣球,找到離被打爆氣球最近的氣球举塔,假設(shè)分?jǐn)?shù)為 L;如果被打爆氣球
 * 的右邊有沒被打爆的氣球绑警,找到離被打爆氣球最近的氣球,假設(shè)分?jǐn)?shù)為 R央渣。 獲得分?jǐn)?shù)為 L*X*R计盒。 2)如果被打爆氣球的
 * 左邊有沒被打爆的氣球,找到離被打爆氣球最近的氣球芽丹,假設(shè)分?jǐn)?shù)為 L;如果被打爆氣球的右邊所有氣球都已經(jīng)被打爆北启。獲
 * 得分?jǐn)?shù)為 L*X。 3)如果被打爆氣球的左邊所有的氣球都已經(jīng)被打爆;如果被打爆氣球的右邊有沒被打爆的 氣球拔第,找到離
 * 被打爆氣球最近的氣球咕村,假設(shè)分?jǐn)?shù)為 R;如果被打爆氣球的右邊所有氣球都 已經(jīng) 被打爆。獲得分?jǐn)?shù)為 X*R蚊俺。 4)如果被
 * 打爆氣球的左邊和右邊所有的氣球都已經(jīng)被打爆懈涛。獲得分?jǐn)?shù)為 X。
 * 目標(biāo)是打爆所有氣球泳猬,獲得每次打爆的分?jǐn)?shù)批钠。通過選擇打爆氣球的順序,可以得到不同的總分得封,請返回能獲得的最大分?jǐn)?shù)埋心。
 * 【舉例】
 * arr = {3,2,5} 如果先打爆3,獲得3*2;再打爆2忙上,獲得2*5;最后打爆5踩窖,獲得5;最后總分21 如果先打爆3,獲得3*2;
 * 再打爆5晨横,獲得2*5;最后打爆2洋腮,獲得2;最后總分18 如果先打爆2箫柳,獲得3*2*5;再打爆3,獲得3*5;最后打爆5啥供,獲得5;
 * 最后總分50 如果先打爆2悯恍,獲得3*2*5;再打爆5,獲得3*5;最后打爆3伙狐,獲得3;最后總分48 如果先打爆5涮毫,獲得2*5;再打
 * 爆3,獲得3*2;最后打爆2贷屎,獲得2;最后總分18 如果先打爆5罢防,獲得2*5;再打爆2,獲得3*2;最后打爆3唉侄,獲得3;最后總分
 * 19 返回能獲得的最大分?jǐn)?shù)為50
 */
public class Balloon {

    // 暴力遞歸
    public static int balloon(int[] arr){
        if(arr == null || arr.length == 0){
            return 0;
        }
        int[] temp = copyArray(arr);
        return process(temp,1,temp.length-2);
    }

    // 在L -> R上打爆所有的氣球咒吐,返回可以獲得的最大分?jǐn)?shù)
    private static int process(int[] arr,int L,int R){
        if(L == R){
            // 范圍上只有一個氣球直接打爆
            return arr[L-1]*arr[L]*arr[R+1];
        }

        // 不止一個氣球,討論可能性属划,以最后一個打爆的氣球是哪個位置為討論點(diǎn)
        // 1.若在L->R上最后一個打爆的位置是L
        int max = 0;
        max = process(arr,L+1,R) + arr[L-1] * arr[L] * arr[R+1];
        // 2.若在L->R上最后一個打爆的位置是R
        max = Math.max(max,process(arr,L,R-1) + arr[L-1] * arr[R] * arr[R+1]);

        // 3.在L+1->R-1中隨意打破哪個
        for (int i = L+1; i < R; i++) {
            max = Math.max(max,process(arr,L,i-1)+process(arr,i+1,R) + arr[L-1] * arr[i] * arr[R+1]);
        }
        return max;
    }

    private static int[] copyArray(int[] arr){
        int[] copy = new int[arr.length+2];
        copy[0] = 1;
        for (int i  = 1;i < copy.length-1;i++){
            copy[i] = arr[i-1];
        }
        copy[copy.length-1] = 1;
        return copy;
    }

    public static void main(String[] args) {
        int[] arr = {3,2,5};
        System.out.println(balloon(arr));
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恬叹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子同眯,更是在濱河造成了極大的恐慌绽昼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件须蜗,死亡現(xiàn)場離奇詭異硅确,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)明肮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門疏魏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晤愧,你說我怎么就攤上這事大莫。” “怎么了官份?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵只厘,是天一觀的道長。 經(jīng)常有香客問我舅巷,道長羔味,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任钠右,我火速辦了婚禮赋元,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己搁凸,他們只是感情好媚值,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著护糖,像睡著了一般褥芒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫡良,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天锰扶,我揣著相機(jī)與錄音,去河邊找鬼寝受。 笑死坷牛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的很澄。 我是一名探鬼主播京闰,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痴怨!你這毒婦竟也來了忙干?” 一聲冷哼從身側(cè)響起器予,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤浪藻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乾翔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爱葵,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年反浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了萌丈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雷则,死狀恐怖辆雾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情月劈,我是刑警寧澤度迂,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站猜揪,受9級特大地震影響惭墓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜而姐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一腊凶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦钧萍、人聲如沸褐缠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽送丰。三九已至,卻和暖如春弛秋,著一層夾襖步出監(jiān)牢的瞬間器躏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工蟹略, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留登失,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓挖炬,卻偏偏與公主長得像揽浙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子意敛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容