题目描述
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
示例 1:
输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
示例 2:
输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。
示例 3:
输入:s = "1229857369"
输出:""
解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。
示例 4:
输入:s = "covid2019"
输出:"c2o0v1i9d"
示例 5:
输入:s = "ab123"
输出:"1a2b3"
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reformat-the-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
思路分析
今天的算法题目是字符串处理题目,题意简单明了,给出了数字和字母的字符串 s,我们需要将字符串重新格式化,使得字母和数字间隔排列。
首先使用朴素解法,遍历字符串 s, 分别按照数字和字符分组。分组之后,统计 charList, numberList 的长度,如果两者的长度之差绝对值大于 1,则不满足格式化条件,返回 ""。如果两者的长度之差绝对值小于 1, 我们重新格式化,格式化的时候,长度较长的列表在前,保证字符和数字的间隔。
具体实现代码如下,供参考。
通过代码
class Solution {
public String reformat(String s) {
StringBuilder ans = new StringBuilder();
List<Character> charList = new ArrayList<>();
List<Character> numberList = new ArrayList<>();
for (char ch : s.toCharArray()) {
if (ch >= '0' && ch <= '9') {
numberList.add(ch);
} else {
charList.add(ch);
}
}
int m = charList.size();
int n = numberList.size();
int i = 0;
if (Math.abs(m - n) > 1) {
ans.append("");
} else {
if (m > n) {
for (; i < n; i++ ) {
ans.append(charList.get(i));
ans.append(numberList.get(i));
}
ans.append(charList.get(i));
} else {
for (; i < m; i++ ) {
ans.append(numberList.get(i));
ans.append(charList.get(i));
}
if (n - m != 0) {
ans.append(numberList.get(i));
}
}
}
return ans.toString();
}
}
复制代码
总结
评论