LC 1417. 重新格式化字符串

题目描述

这是 LeetCode 上的 1417. 重新格式化字符串 ,难度为 简单

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

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

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

示例 1:

1
2
3
4
5
输入:s = "a0b1c2"

输出:"0a1b2c"

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

示例 2:
1
2
3
4
5
输入:s = "leetcode"

输出:""

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

示例 3:
1
2
3
4
5
输入:s = "1229857369"

输出:""

解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。

示例 4:
1
2
3
输入:s = "covid2019"

输出:"c2o0v1i9d"

示例 5:
1
2
3
输入:s = "ab123"

输出:"1a2b3"

提示:

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

模拟

起始先对字符串 s 进行遍历,将其分成字母串和数字串,若两者长度差值超过 $1$,说明无法构造成间隔字符串(返回空串),否则对两字符串使用双指针算法进行构造。

Java 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public String reformat(String s) {
StringBuilder a = new StringBuilder(), b = new StringBuilder();
for (char c : s.toCharArray()) {
if (c >= 'a') a.append(c);
else b.append(c);
}
int n = a.length(), m = b.length(), tot = n + m;
if (Math.abs(n - m) > 1) return "";
StringBuilder sb = new StringBuilder();
while (sb.length() != tot) {
if (n > m) sb.append(a.charAt(--n));
else if (n < m) sb.append(b.charAt(--m));
else {
if (!sb.isEmpty() && sb.charAt(sb.length() - 1) >= 'a') sb.append(b.charAt(--m));
else sb.append(a.charAt(--n));
}
}
return sb.toString();
}
}

TypeScript 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function reformat(s: string): string {
let a = "", b = ""
for (let i = 0; i < s.length; i++) {
if (s[i] >= 'a') a += s[i]
else b += s[i]
}
let n = a.length, m = b.length, tot = n + m
if (Math.abs(n - m) > 1) return ""
let ans = ""
while (ans.length < tot) {
if (n < m) ans += b[--m]
else if (n > m) ans += a[--n]
else {
if (ans.length != 0 && ans[ans.length - 1] >= 'a') ans += b[--m]
else ans += a[--n]
}
}
return ans
};

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$

最后

这是我们「刷穿 LeetCode」系列文章的第 No.1417 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。