Given alphanumeric string s. (Alphanumeric string is a string consisting of lowercase English letters and digits).
You have to find a permutation of the string where no letter is followed by another letter and no digit is followed by another digit. That is, no two adjacent characters have the same type.
Return the reformatted string or return an empty string if it is impossible to reformat the string.
Example 1:
Input: s = "a0b1c2"
Output: "0a1b2c"
Explanation: No two adjacent characters have the same type in "0a1b2c". "a0b1c2", "0a1b2c", "0c2a1b" are also valid permutations.
Example 2:
Input: s = "leetcode"
Output: ""
Explanation: "leetcode" has only characters so we cannot separate them by digits.
Example 3:
Input: s = "1229857369"
Output: ""
Explanation: "1229857369" has only digits so we cannot separate them by characters.
Example 4:
Input: s = "covid2019"
Output: "c2o0v1i9d"
Example 5:
Input: s = "ab123"
Output: "1a2b3"
Constraints:
1 <= s.length <= 500
s consists of only lowercase English letters and/or digits.
这题不难,最直接的方法就是分拣出字母和数字,然后依次进行组合,直到用完。
我这里比较复杂,先计算出个数,判断能否组成结果的字符串。之后使用两个指针分别从原始串中取想要的元素。
class ReformatTheString : public Solution {
public:
void Exec() {
auto res = reformat("a0b1c2");
}
string reformat(string s) {
int numCount = 0;
int alpCount = 0;
string res;
for (auto c : s) {
if (c >= '0' && c <= '9') {
numCount++;
} else {
alpCount++;
}
}
if (abs(numCount - alpCount) > 1) {
return "";
}
int numPtr = 0;
int alpPtr = 0;
int typ = 0;
if (alpCount > numCount) {
typ = 1;
}
while (res.size() != s.size()) {
if (typ % 2 == 0) {
while (s[numPtr] < '0' || s[numPtr] > '9') {
numPtr++;
}
res.push_back(s[numPtr++]);
} else {
while (s[alpPtr] < 'a' || s[alpPtr] > 'z') {
alpPtr++;
}
res.push_back(s[alpPtr++]);
}
typ++;
}
return res;
}
};