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的值與所有滿足條件的子串的數量是一致的。
可以得出這樣的迭代關係:
aCount = aCount + aCount + 1
:對於a,分爲三種情況:第一種情況,直接忽略這個a,使用前邊的a,這樣的數量是aCount;第二種情況,跟隨前邊的a,即aa,這樣的數量也是aCount;第三種情況,這個a重新作爲一個開始,這樣的數量是1。所以就有上邊的公式成立。bCount = aCount + bCount + bCount
: 對於b,有三種情況:第一種情況,直接忽略這個b,使用前邊的b,這樣的數量爲bCount;第二種情況,跟隨前邊的b,即bb,這樣的數量是bCount;第三種情況,不使用前邊的b,而以這個b直接跟隨a,這樣的數量爲aCount。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;
}