LintCode 練習-734. 形式爲a^i b^j c^k的子序列數量

734. 形式爲a^i b^j c^k的子序列數量

題目描述:

給一字符串, 對形式爲 a^i b^j c^k的子序列進行計數, 即它由 i 個字符 a, 接着是 j 個字符 b, 然後是 k 個字符 c組成, i >= 1, j >= 1, k >= 1.

Note: 如果兩個子序列在原字符串中的index集合是不同的,則認爲兩個子序列不同。

樣例

給定 s = abbc, 返回 3 子序列爲 abc, abc 和 abbc

給定 s = abcabc, 返回 7 子序列爲 abc, abc, abbc, aabc, abcc, abc 和 abc

思路:

分別用變量aCount,bCount,cCount來表示a,b,c出現的次數。則cCount的值與所有滿足條件的子串的數量是一致的。

可以得出這樣的迭代關係:

  1. aCount = aCount + aCount + 1:對於a,分爲三種情況:第一種情況,直接忽略這個a,使用前邊的a,這樣的數量是aCount;第二種情況,跟隨前邊的a,即aa,這樣的數量也是aCount;第三種情況,這個a重新作爲一個開始,這樣的數量是1。所以就有上邊的公式成立。
  2. bCount = aCount + bCount + bCount: 對於b,有三種情況:第一種情況,直接忽略這個b,使用前邊的b,這樣的數量爲bCount;第二種情況,跟隨前邊的b,即bb,這樣的數量是bCount;第三種情況,不使用前邊的b,而以這個b直接跟隨a,這樣的數量爲aCount。
  3. cCount = bCount + cCount + cCount:與b同理。

所以,就可以得到這樣的代碼:

    /*
     * @param : the input string
     * @return: the number of subsequences
     */
    public int countSubsequences(String source) {
        int aCount = 0;
        int bCount = 0;
        int cCount = 0;
        for (int i = 0; i < source.length(); i++) {
            switch (source.charAt(i)) {
                case 'a':
                    aCount = aCount + aCount + 1;
                    break;
                case 'b':
                    bCount = aCount + bCount + bCount;
                    break;
                case 'c':
                    cCount = bCount + cCount + cCount;
                    break;
                default:
                    break;
            }
        }
        return cCount;
    }

參考kaaokou的博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章