题目地址:
给定一个只含英文字母和数字的字符串 s s s,要求将其重排,使得任意相邻两个字符都是一个是字母一个是数字(顺序无所谓)。如果无解则返回空串。
可以存一下所有的字母和所有的数字。如果两者数量差距大于等于 2 2 2则无解。否则交替append即可。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public String reformat(String s) {
List<Character>[] list = (List<Character>[]) new List[2];
list[0] = new ArrayList<>();
list[1] = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (Character.isLetter(ch)) {
list[0].add(ch);
} else if (Character.isDigit(ch)) {
list[1].add(ch);
}
}
if (Math.abs(list[0].size() - list[1].size()) >= 2) {
return "";
}
if (list[0].size() < list[1].size()) {
List<Character> tmp = list[0];
list[0] = list[1];
list[1] = tmp;
}
StringBuilder sb = new StringBuilder();
for (int i = 0, j = 0; i < list[0].size() || j < list[1].size(); i++, j++) {
sb.append(list[0].get(i));
if (j < list[1].size()) {
sb.append(list[1].get(j));
}
}
return sb.toString();
}
}
时空复杂度 O ( l s ) O(l_s) O(ls)。