public
class
Main {
static
int
countSubsequences(
int
idx,
boolean
hasA,
boolean
hasB,
boolean
hasC, String s) {
int
n = s.length();
if
(idx == n) {
if
(hasC) {
return
1
;
}
return
0
;
}
int
opt1 =
0
, opt2 =
0
;
if
(hasC) {
if
(s.charAt(idx) ==
'c'
) {
opt1 = countSubsequences(idx +
1
,
true
,
true
,
true
, s);
opt1 += countSubsequences(idx +
1
,
true
,
true
,
true
, s);
}
else
{
opt2 = countSubsequences(idx +
1
,
true
,
true
,
true
, s);
}
}
else
if
(hasB) {
if
(s.charAt(idx) ==
'b'
) {
opt1 = countSubsequences(idx +
1
,
true
,
true
,
false
, s);
opt1 += countSubsequences(idx +
1
,
true
,
true
,
false
, s);
}
else
if
(s.charAt(idx) ==
'c'
) {
opt1 = countSubsequences(idx +
1
,
true
,
true
,
true
, s);
opt1 += countSubsequences(idx +
1
,
true
,
true
,
false
, s);
}
else
{
opt2 = countSubsequences(idx +
1
,
true
,
true
,
false
, s);
}
}
else
if
(hasA) {
if
(s.charAt(idx) ==
'a'
) {
opt1 = countSubsequences(idx +
1
,
true
,
false
,
false
, s);
opt1 += countSubsequences(idx +
1
,
true
,
false
,
false
, s);
}
else
if
(s.charAt(idx) ==
'b'
) {
opt1 = countSubsequences(idx +
1
,
true
,
true
,
false
, s);
opt1 += countSubsequences(idx +
1
,
true
,
false
,
false
, s);
}
else
{
opt2 = countSubsequences(idx +
1
,
true
,
false
,
false
, s);
}
}
else
{
if
(s.charAt(idx) ==
'a'
) {
opt1 = countSubsequences(idx +
1
,
true
,
false
,
false
, s);
}
opt2 = countSubsequences(idx +
1
,
false
,
false
,
false
, s);
}
return
opt1 + opt2;
}
public
static
void
main(String[] args) {
String s =
"abbc"
;
System.out.println(countSubsequences(
0
,
false
,
false
,
false
, s));
}
}