C/C++ 题解 LeetCode 1417 重新格式化字符串
题目描述
给定一个由字母、数字和空格组成的字符串 s,你需要将其重新格式化,使得任意两个相邻字符之间都有且仅有一个空格,并且首尾字符之间也不能有空格。
返回 重新格式化后的字符串,如果无法按要求重新格式化,则返回一个 空字符串。
示例说明
示例 1
输入:s = "a0b1c2"
输出:"a 0b 1c 2"
解释:没有任何两个相邻字符之间可以插入一个空格。
示例 2
输入:s = "leetcode"
输出:""
解释:"leetcode" 中没有空格,所以无法满足重新格式化的条件。
示例 3
输入:s = "1229857369"
输出:""
解释:"1229857369" 中数字之间连续,所以无法满足重新格式化的条件。
示例 4
输入:s = "covid2019"
输出:"c o v i d 2 0 1 9"
解释:s 中相邻字符之间都需要插入一个空格。
算法实现
- 将字符串 s 中的字母和数字都保存到两个不同的数组中。
char letters[101], digits[101];
int numLetters = 0, numDigits = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'a' && s[i] <= 'z')
letters[numLetters++] = s[i];
else if (s[i] >= '0' && s[i] <= '9')
digits[numDigits++] = s[i];
}
- 根据字母、数字数组的长度,判断是否可以满足重新格式化要求。
- 当字母和数字数组的长度之差的绝对值超过 1 时,无法满足重新格式化要求,返回空字符串。
- 当字母数组的长度等于数字数组的长度时,交替插入字母和数字即可。
- 当字母数组的长度大于数字数组的长度时,先插入字母,然后在末尾插入一次数字即可。
- 当字母数组的长度小于数字数组的长度时,先插入数字,然后在末尾插入一次字母即可。
int sizeDiff = numLetters - numDigits;
if (sizeDiff > 1 || sizeDiff < -1) // 长度差大于 1 时无法重新格式化
return "";
int totalSize = numLetters + numDigits;
int letterIndex = 0, digitIndex = 0;
bool firstIsLetter = numLetters > numDigits ? true : false;
for (int i = 0; i < totalSize; i++) {
if (firstIsLetter) {
if (i % 2 == 0)
result += letters[letterIndex++];
else
result += digits[digitIndex++];
} else {
if (i % 2 == 0)
result += digits[digitIndex++];
else
result += letters[letterIndex++];
}
}
if (numLetters == numDigits && firstIsLetter) // 字母和数字数量相同时的特殊处理
result.insert(1, " ");
else if (numLetters == numDigits && !firstIsLetter)
result.insert(0, " ");
else if (firstIsLetter)
result.insert(result.length(), 1, digits[digitIndex]); // 数字数量小于字母数量时的特殊处理
else
result.insert(0, 1, letters[letterIndex]);
完整代码
class Solution {
public:
string reformat(string s) {
string result = "";
char letters[101], digits[101];
int numLetters = 0, numDigits = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'a' && s[i] <= 'z')
letters[numLetters++] = s[i];
else if (s[i] >= '0' && s[i] <= '9')
digits[numDigits++] = s[i];
}
int sizeDiff = numLetters - numDigits;
if (sizeDiff > 1 || sizeDiff < -1)
return "";
int totalSize = numLetters + numDigits;
int letterIndex = 0, digitIndex = 0;
bool firstIsLetter = numLetters > numDigits ? true : false;
for (int i = 0; i < totalSize; i++) {
if (firstIsLetter) {
if (i % 2 == 0)
result += letters[letterIndex++];
else
result += digits[digitIndex++];
} else {
if (i % 2 == 0)
result += digits[digitIndex++];
else
result += letters[letterIndex++];
}
}
if (numLetters == numDigits && firstIsLetter)
result.insert(1, " ");
else if (numLetters == numDigits && !firstIsLetter)
result.insert(0, " ");
else if (firstIsLetter)
result.insert(result.length(), 1, digits[digitIndex]);
else
result.insert(0, 1, letters[letterIndex]);
return result;
}
};
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C C++ 题解LeetCode1417重新格式化字符串 - Python技术站