同位字符串连接的最小长度

2024-12-20

题目:

给你一个字符串 s ,它由某个字符串 t 和若干 t同位字符串 连接而成。请你返回字符串 t最小 可能长度。

同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。

示例 1:

输入:s = “abba”

输出:2

解释:

一个可能的字符串 t"ba"

示例 2:

输入:s = “cdef”

输出:4

解释:

一个可能的字符串 t"cdef" ,注意 t 可能等于 s

提示:

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

思路:

由题意可知,字符串 t 的长度一定为字符串 s 的长度 n 的因数,因此我们可以从小到大枚举 n 的因数作为 t 的长度。令当前枚举的因数为 i,我们将字符串 s 切分为若干个长度为 i 的子字符串,用 count0 统计前一子字符串的字符出现次数,用 count1 统计后一子字符串的出现次数,如果 count0 不等于 count1 ,那么说明 i 不符合题意;否则说明所有子字符串的字符出现次数都相等,那么返回 i 作为 t 的最小可能长度。

代码:

class Solution {
public:
    int minAnagramLength(string s) {
        int n = s.size();
        auto check = [&](int m) -> bool {
            vector<int> count0(26);
            for (int j = 0; j < n; j += m) {
                vector<int> count1(26);
                for (int k = j; k < j + m; k++) {
                    count1[s[k] - 'a']++;
                }
                if (j > 0 && count0 != count1) {
                    return false;
                }
                count0.swap(count1);
            }
            return true;
        };
        for (int i = 1; i < n; i++) {
            if (n % i != 0) {
                continue;
            }
            if (check(i)) {
                return i;
            }
        }
        return n;
    }
};