列表

详情


6276. 统计同位异构字符串数目

给你一个字符串 s ,它包含一个或者多个单词。单词之间用单个空格 ' ' 隔开。

如果字符串 t 中第 i 个单词是 s 中第 i 个单词的一个 排列 ,那么我们称字符串 t 是字符串 s 的同位异构字符串。

请你返回 s 的同位异构字符串的数目,由于答案可能很大,请你将它对 109 + 7 取余 后返回。

 

示例 1:

输入:s = "too hot"
输出:18
解释:输入字符串的一些同位异构字符串为 "too hot" ,"oot hot" ,"oto toh" ,"too toh" 以及 "too oht" 。

示例 2:

输入:s = "aa"
输出:1
解释:输入字符串只有一个同位异构字符串。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int countAnagrams(string s) { } };

python3 解法, 执行用时: 260 ms, 内存消耗: 16 MB, 提交时间: 2022-12-25 12:08:02

MOD = 10 ** 9 + 7


class Solution:
    def countAnagrams(self, s: str) -> int:
        ans = 1
        for word in s.split():
            n = len(word)
            for v in Counter(word).values():
                ans *= comb(n, v)
                ans %= MOD
                n -= v
        return ans

golang 解法, 执行用时: 8 ms, 内存消耗: 5.6 MB, 提交时间: 2022-12-25 12:07:10

const mod int = 1e9 + 7

func countAnagrams(s string) int {
	ans, mul := 1, 1
	for _, s := range strings.Split(s, " ") {
		cnt := [26]int{}
		for i, c := range s {
			cnt[c-'a']++
			mul = mul * cnt[c-'a'] % mod
			ans = ans * (i + 1) % mod
		}
	}
	return ans * pow(mul, mod-2) % mod
}

func pow(x, n int) int {
	res := 1
	for ; n > 0; n >>= 1 {
		if n&1 > 0 {
			res = res * x % mod
		}
		x = x * x % mod
	}
	return res
}

cpp 解法, 执行用时: 20 ms, 内存消耗: 8.8 MB, 提交时间: 2022-12-25 12:06:50

class Solution {
    const int MOD = 1e9 + 7;

    long pow(long x, int n) {
        long res = 1L;
        for (; n; n /= 2) {
            if (n % 2) res = res * x % MOD;
            x = x * x % MOD;
        }
        return res;
    }

public:
    int countAnagrams(string &s) {
        long ans = 1L, mul = 1L;
        int cnt[26]{};
        for (int i = 0, j = 0; i < s.length(); ++i) {
            if (s[i] == ' ') {
                memset(cnt, 0, sizeof(cnt));
                j = 0;
            } else {
                mul = mul * ++cnt[s[i] - 'a'] % MOD;
                ans = ans * ++j % MOD;
            }
        }
        return ans * pow(mul, MOD - 2) % MOD;
    }
};

java 解法, 执行用时: 8 ms, 内存消耗: 42.6 MB, 提交时间: 2022-12-25 12:06:31

class Solution {
    private static final int MOD = (int) 1e9 + 7;

    public int countAnagrams(String S) {
        var s = S.toCharArray();
        long ans = 1L, mul = 1L;
        var cnt = new int[26];
        for (int i = 0, j = 0; i < s.length; ++i) {
            if (s[i] == ' ') {
                Arrays.fill(cnt, 0);
                j = 0;
            } else {
                mul = mul * ++cnt[s[i] - 'a'] % MOD;
                ans = ans * ++j % MOD;
            }
        }
        return (int) (ans * pow(mul, MOD - 2) % MOD);
    }

    private long pow(long x, int n) {
        var res = 1L;
        for (; n > 0; n /= 2) {
            if (n % 2 > 0) res = res * x % MOD;
            x = x * x % MOD;
        }
        return res;
    }
}

python3 解法, 执行用时: 304 ms, 内存消耗: 15.9 MB, 提交时间: 2022-12-25 12:06:10

class Solution:
    def countAnagrams(self, s: str) -> int:
        MOD = 10 ** 9 + 7
        ans = mul = 1
        for s in s.split():
            cnt = Counter()
            for i, c in enumerate(s, 1):
                cnt[c] += 1
                mul = mul * cnt[c] % MOD
                ans = ans * i % MOD
        return ans * pow(mul, -1, MOD) % MOD

上一题