「每日LeetCode」2021年2月4日

本文最后更新于:2023年3月19日 晚上

Lt1417. 重新格式化字符串

1417. 重新格式化字符串

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串
 示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

1
2
输入:s = "covid2019"
输出:"c2o0v1i9d"

示例 5:

1
2
输入:s = "ab123"
输出:"1a2b3"

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母和/或数字组成。

思路

两个数组存数字和字符,再判断两个数组长度差是否大于 1,大于则不能格式化,返回空字符串。
如果两个数组相等,分别遍历数组,轮流加入结果字符串。
如果不等,遍历数组,先加入大的数组中的对应字符,再加入小的数组中的对应字符。遍历后再将大的最后一位加入字符串。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* @param {string} s
* @return {string}
*/
var reformat = function (s) {
const reg1 = /^[0-9]*$/,
reg2 = /^[a-zA-Z]*$/;
const num = [],
arr = [];
for (const char of s) {
if (reg1.test(char)) num.push(char);
if (reg2.test(char)) arr.push(char);
}
if (Math.abs(num.length - arr.length) > 1) return "";
const min = num.length < arr.length ? num : arr;
const max = num.length < arr.length ? arr : num;
let res = "";
for (let i = 0; i < min.length; i++) {
res += max[i] + min[i];
}
if (max.length > min.length) {
res += max[max.length - 1];
}
return res;
};