题目描述
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reformat-the-string
思路
- 一开始想到的是统计数字和字母的数量,遍历一遍字符串并且把它们分别放入对应的栈中存放起来,若 |数字的数量 - 字母的数量 | > 1,则该字符串无法进行格式化;
- 若数字的字母多,则数字先出栈,反之字母先出栈构成答案;
- 返回重构字符串的逆序;
但是以上的做法有个坏处,就是代码又臭又长并且耗费了额外的空间,能否就在原来的字符串上进行变动呢? - 稍加思索一下即可,将数量多的置奇数位,数量少的置偶数位
代码
string reformat(string s) {
int sum_digit = 0;
for (auto& c : s) {
if (isdigit(c)) {
sum_digit++;
}
}
int sum_alpha = s.size() - sum_digit;
if (abs(sum_digit - sum_alpha) > 1) {
return "";
}
bool flag = sum_digit > sum_alpha;
for (int i = 0, j = 1; i < s.size(); i += 2) {
if (isdigit(s[i]) != flag) {
while (isdigit(s[j]) != flag) {
j += 2;
}
swap(s[i], s[j]);
}
}
return s;
}