LeetCode 5388.重新格式化字符串

题目

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

请你返回重新格式化后的字符串;如果无法按要求重新格式化,则返回一个空字符串

题目链接

示例

示例1

输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。

示例2

输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。

题目分析

遍历一次给定字符串,将数字和字母分别加入两个队列中。

vector a;
vector b;
for (auto t : s){
    if (t >= '0' && t <= '9') a.push(t);
    else b.push(t);
}

检查两个队列的长度,如果长度之差的绝对值小于等于1,那么说明可以将字符串重新格式化;如果大于1,那么说明不可以重新格式化,直接返回空的字符串。

int temp = abs(a.size() - b.size());
string res;

if (temp <= 1){
   // 可以重排 
}else {
    // 不可以重排
    return res;
}

在可以重排的情况下,只需要依次插入两个字符串即可。

但要注意的是,需要确定插入新字符串的顺序。比如对于s = "covid2019"的例子,a = 2019,b = covid。如果先插入a,再插入b,那么结果就错了,所以要调整插入的顺序。

if (a.size() < b.size()) swap(a, b);
for (int i = 0; i < s.length(); i++){
    if (i % 2 == 0){
        res += a.front();
        a.pop();
    }else {
        res += b.front();
        b.pop();
    }
}

return res;

题目解答

class Solution {
public:
    queue a;
    queue b;
    string res;

    string reformat(string s) {
        for (auto temp : s){
            if (temp >= '0' && temp <= '9'){
                a.push(temp);
            }else {
                b.push(temp);
            }
        }

        int temp = a.size() - b.size();

        if (abs(temp) <= 1){
            if (a.size() < b.size()) swap(a, b);
            for (int i = 0; i < s.length(); i++){
                if (i % 2 == 0){
                    res += a.front();
                    a.pop();
                }else {
                    res += b.front();
                    b.pop();
                }
            }
        }else {
            return res;
        }

        return res;
    }
    
};

你可能感兴趣的:(LeetCode 5388.重新格式化字符串)