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
21class 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
19function 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 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!