给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
先上答案:
class Solution {
public List<String> letterCasePermutation(String s) {
List<String> result = new ArrayList();
result.add(s);
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= 'A'){
int size = result.size();
for (int j = 0; j < size; j++) {
char[] a = result.get(j).toCharArray();
if (a[i] >= 'a'){
// 小写转大写
a[i] = (char) (a[i] - 32);
}
else{
// 大写转小写
a[i] = (char) (a[i] + 32);
}
result.add(new String(a));
}
}
}
return result;
}
}
刚开始的时候想先遍历集合,再if判断是要“小写字母转大写字母”还是“大写字母转小写字母”,结果发现当输入为s = "3z4"时还可以正常输出,但是当输入为s = "a1b2"时输出就错误了。
class Solution {
public List<String> letterCasePermutation(String s) {
List<String> result = new ArrayList<>();
result.add(s);
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) >= 'a'){
//是小写字母
int a = s.charAt(i) -32;
char a1 = (char)a;
String aString= s.replace(s.charAt(i),a1);
result.add(aString);
}
else if (s.charAt(i) < 'a' && s.charAt(i) >= 'A'){
//是大写字母
int b = s.charAt(i) + 32;
char b1 = (char) b;
String bString= s.replace(s.charAt(i),b1);
result.add(bString);
}
}
}
return result;
}
}
原因是只考虑到了一层遍历,只能输出a1b2、A1b2、a1B2,而无法输出A1B1,则需要考虑第二层遍历。并且再看了【爪哇缪斯】的讲解后发现自己的代码将大写字母与小写字母转换分开进行,使代码复杂了很多,所以修改代码,用一个简便的方式将他们写在一起。