from collections import defaultdict



mod = 10 ** 9 + 7



n = int(eval(input()))

s = eval(input())



d = defaultdict(int)



ans = 0

for c in s:

    d[c] += 1

    t = 1

    for chr_, cnt in list(d.items()):

        if chr_ == c:

            continue

        t *= cnt + 1

    ans = (ans + t) % mod

print(ans)

from collections import Counter

from functools import reduce

from operator import mul



mod = 10 ** 9 + 7





def my_mul(a, b):

    return a * b % mod





n = int(eval(input()))

s = eval(input())



cnt = Counter(s)



print((reduce(my_mul, (v + 1 for v in list(cnt.values()))) - 1))



# 同じ文字列でも、異なる位置から作られたものは区別するため、2

# N − 1 通りのすべての部分列が区別され

# ることになります。

# 条件より、同じ文字を 2 度使ってはいけないため、ある文字 c について colorful の条件を壊さないとり方

# は (c の出現回数 + 1) となります (どれか 1 つを取るケース及び文字 c を一切取らないケース)

# すべての文字 c についてのこのとり方の積を求め、空文字列の分の 1 を引いた数が答えとなります。

from collections import defaultdict

mod = 10**9 + 7
n = int(eval(input()))
s = eval(input())
d = defaultdict(int)
ans = 0
for c in s:
    d[c] += 1
    t = 1
    for chr_, cnt in list(d.items()):
        if chr_ == c:
            continue
        t *= cnt + 1
    ans = (ans + t) % mod
print(ans)

from collections import Counter
from functools import reduce
from operator import mul

mod = 10**9 + 7


def my_mul(a, b):
    return a * b % mod


n = int(eval(input()))
s = eval(input())
cnt = Counter(s)
print((reduce(my_mul, (v + 1 for v in list(cnt.values()))) - 1))
# 同じ文字列でも、異なる位置から作られたものは区別するため、2
# N − 1 通りのすべての部分列が区別され
# ることになります。
# 条件より、同じ文字を 2 度使ってはいけないため、ある文字 c について colorful の条件を壊さないとり方
# は (c の出現回数 + 1) となります (どれか 1 つを取るケース及び文字 c を一切取らないケース)
# すべての文字 c についてのこのとり方の積を求め、空文字列の分の 1 を引いた数が答えとなります。

-from collections import defaultdict +from collections import Counter +from functools import reduce +from operator import mul + + +def my_mul(a, b): +    return a * b % mod + + -d = defaultdict(int) -ans = 0 -for c in s: -    d[c] += 1 -    t = 1 -    for chr_, cnt in list(d.items()): -        if chr_ == c: -            continue -        t *= cnt + 1 -    ans = (ans + t) % mod -print(ans) +cnt = Counter(s) +print((reduce(my_mul, (v + 1 for v in list(cnt.values()))) - 1)) +# 同じ文字列でも、異なる位置から作られたものは区別するため、2 +# N − 1 通りのすべての部分列が区別され +# ることになります。 +# 条件より、同じ文字を 2 度使ってはいけないため、ある文字 c について colorful の条件を壊さないとり方 +# は (c の出現回数 + 1) となります (どれか 1 つを取るケース及び文字 c を一切取らないケース) +# すべての文字 c についてのこのとり方の積を求め、空文字列の分の 1 を引いた数が答えとなります。