题目:
给你一个字符串 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;
}
};