题目描述
给你一个混合了数字和字母的字符串 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(); }}
复制代码
总结
评论