有一个密钥字符串 S ,只包含字母,数字以及 '-'(破折号)。其中, N 个 '-' 将字符串分成了 N+1 组。
给你一个数字 K,请你重新格式化字符串,使每个分组恰好包含 K 个字符。特别地,第一个分组包含的字符个数必须小于等于 K,但至少要包含 1 个字符。两个分组之间需要用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。
给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。
来源:力扣(LeetCode)
char
* licenseKeyFormatting(char * s, int k)
{
// length表示元素个数
int length = strlen (s);
// alphaSize 表示所含字母元素个数
int alphaSize = 0;
for (int i = 0; i < length; i ++)
{
// 过滤符号
if (s[i] != '-')
{
s[alphaSize] = toupper (s[i]);
alphaSize ++;
}
}
if (alphaSize == 0)
{
// 第35个测试报错
return "";
}
// partSize 为每一段元素个数, partSum 为被分成得数量
int partSize = alphaSize % k == 0 ? k : alphaSize % k;
int partSum = partSize == k ? alphaSize / k : alphaSize / k + 1;
char *ans = (char *)malloc (sizeof (char) * (alphaSize + partSum));
// 表示第一段, 第一段特殊, 可以比K小, 因此单独考虑
for (int j = 0; j < partSize; j ++)
{
ans[j] = s[j];
}
ans[partSize] = '-';
int cnt = 0, index = partSize + 1;
for (int n = partSize; n < alphaSize; n ++)
{
ans[index] = s[n];
index ++;
cnt ++;
if (cnt == k)
{
cnt = 0;
ans[index] = '-';
index ++;
}
}
ans[alphaSize + partSum - 1] = '\0';
return ans;
}