Welcome to Subscribe On Youtube

2930. Number of Strings Which Can Be Rearranged to Contain Substring

Description

You are given an integer n.

A string s is called good if it contains only lowercase English characters and it is possible to rearrange the characters of s such that the new string contains "leet" as a substring.

For example:

  • The string "lteer" is good because we can rearrange it to form "leetr" .
  • "letl" is not good because we cannot rearrange it to contain "leet" as a substring.

Return the total number of good strings of length n.

Since the answer may be large, return it modulo 109 + 7.

A substring is a contiguous sequence of characters within a string.

 

 

Example 1:

Input: n = 4
Output: 12
Explanation: The 12 strings which can be rearranged to have "leet" as a substring are: "eelt", "eetl", "elet", "elte", "etel", "etle", "leet", "lete", "ltee", "teel", "tele", and "tlee".

Example 2:

Input: n = 10
Output: 83943898
Explanation: The number of strings with length 10 which can be rearranged to have "leet" as a substring is 526083947580. Hence the answer is 526083947580 % (109 + 7) = 83943898.

 

Constraints:

  • 1 <= n <= 105

Solutions

  • class Solution {
        private final int mod = (int) 1e9 + 7;
    
        public int stringCount(int n) {
            long a = qpow(25, n);
            long b = a;
            long c = (qpow(25, n) + n * qpow(25, n - 1) % mod) % mod;
            long ab = qpow(24, n);
            long ac = (qpow(24, n) + n * qpow(24, n - 1) % mod) % mod;
            long bc = ac;
            long abc = (qpow(23, n) + n * qpow(23, n - 1) % mod) % mod;
            long tot = qpow(26, n);
            return (int) ((tot - (a + b + c - ab - ac - bc + abc)) % mod + mod) % mod;
        }
    
        private long qpow(long a, int n) {
            long ans = 1;
            for (; n > 0; n >>= 1) {
                if ((n & 1) == 1) {
                    ans = ans * a % mod;
                }
                a = a * a % mod;
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        int stringCount(int n) {
            const int mod = 1e9 + 7;
            using ll = long long;
            auto qpow = [&](ll a, int n) {
                ll ans = 1;
                for (; n; n >>= 1) {
                    if (n & 1) {
                        ans = ans * a % mod;
                    }
                    a = a * a % mod;
                }
                return ans;
            };
            ll a = qpow(25, n);
            ll b = a;
            ll c = (qpow(25, n) + n * qpow(25, n - 1) % mod) % mod;
            ll ab = qpow(24, n);
            ll ac = (qpow(24, n) + n * qpow(24, n - 1) % mod) % mod;
            ll bc = ac;
            ll abc = (qpow(23, n) + n * qpow(23, n - 1) % mod) % mod;
            ll tot = qpow(26, n);
            return ((tot - (a + b + c - ab - ac - bc + abc)) % mod + mod) % mod;
        }
    };
    
  • class Solution:
        def stringCount(self, n: int) -> int:
            mod = 10**9 + 7
            a = b = pow(25, n, mod)
            c = pow(25, n, mod) + n * pow(25, n - 1, mod)
            ab = pow(24, n, mod)
            ac = bc = (pow(24, n, mod) + n * pow(24, n - 1, mod)) % mod
            abc = (pow(23, n, mod) + n * pow(23, n - 1, mod)) % mod
            tot = pow(26, n, mod)
            return (tot - (a + b + c - ab - ac - bc + abc)) % mod
    
    
  • func stringCount(n int) int {
    	const mod int = 1e9 + 7
    	qpow := func(a, n int) int {
    		ans := 1
    		for ; n > 0; n >>= 1 {
    			if n&1 == 1 {
    				ans = ans * a % mod
    			}
    			a = a * a % mod
    		}
    		return ans
    	}
    	a := qpow(25, n)
    	b := a
    	c := qpow(25, n) + n*qpow(25, n-1)
    	ab := qpow(24, n)
    	ac := (qpow(24, n) + n*qpow(24, n-1)) % mod
    	bc := ac
    	abc := (qpow(23, n) + n*qpow(23, n-1)) % mod
    	tot := qpow(26, n)
    	return ((tot-(a+b+c-ab-ac-bc+abc))%mod + mod) % mod
    }
    
  • function stringCount(n: number): number {
        const mod = BigInt(10 ** 9 + 7);
        const qpow = (a: bigint, n: number): bigint => {
            let ans = 1n;
            for (; n; n >>>= 1) {
                if (n & 1) {
                    ans = (ans * a) % mod;
                }
                a = (a * a) % mod;
            }
            return ans;
        };
        const a = qpow(25n, n);
        const b = a;
        const c = (qpow(25n, n) + ((BigInt(n) * qpow(25n, n - 1)) % mod)) % mod;
        const ab = qpow(24n, n);
        const ac = (qpow(24n, n) + ((BigInt(n) * qpow(24n, n - 1)) % mod)) % mod;
        const bc = ac;
        const abc = (qpow(23n, n) + ((BigInt(n) * qpow(23n, n - 1)) % mod)) % mod;
        const tot = qpow(26n, n);
        return Number((((tot - (a + b + c - ab - ac - bc + abc)) % mod) + mod) % mod);
    }
    
    

All Problems

All Solutions