同位字符串连接的最小长度(枚举因子)

https://leetcode.cn/problems/minimum-length-of-anagram-concatenation/description/

给你一个字符串s,它由某个字符串t和若干t同位字符串 连接而成。
请你返回字符串t最小 可能长度。
同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。

示例 1:
输入:s = "abba"
输出:2
解释:
一个可能的字符串 t 为 "ba" 。

示例 2:
输入:s = "cdef"
输出:4
解释:
一个可能的字符串 t 为 "cdef" ,注意 t 可能等于 s 。

提示:
1<=s.length<=105
s 只包含小写英文字母。

中文题意很不清晰,我们重新描述一下题目:给定一个字符串s,它是由某个字符串t以及它的若干个同位字符串连接而成。问字符串 t 的最小可能长度。
显然 t 的长度必须是 s 的因数。105以内因数最多的数是 83160,有128个因数。因数个数不多,可以考虑直接枚举因数 p
问题变为如何检查字符串 s 是不是由若干个长度为 p 的同位字符串连接而成。那么将 s 分成长度为 p 的子串,并检查每个子串每种字母出现次数是否相同即可。

class Solution {
public:
    int minAnagramLength(string s) {
        int n=s.size();
        int cnt[26]={0};
        for(char c:s) cnt[c-'a']++;
        auto check=[&](int len){
            for(int i=0;i<n;i+=len){
                int tmp[26]={0};
                for(int j=0;j<len;j++) tmp[s[i+j]-'a']++;
                for(int j=0;j<26;j++) if(tmp[j]*(n/len)!=cnt[j]) return false;
            }
            return true;
        };
        // 枚举子串的长度
        for (int i = 1; i <= n; i++) if (n % i == 0 && check(i)) return i;

        return -1;
    }
};
posted @   lipu123  阅读(28)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2020-06-05 dp不平衡数组
2020-06-05 圆桌问题 (a)
点击右上角即可分享
微信分享提示