题目如下图所示:
通过读题,发现需要将字符串中的字母转换成相反的大小写形式,数字形式不变。初读题意比较简单,但是在实现的时候,会出现很多细节问题。通过分析,该问题是子集生成算法的衍生版本。具体思路和代码实现如下所示:
import java.util.ArrayList;
import java.util.List;
/**
* Created by hadoop on 18-2-18.
* 晚上整理,整个问题可以看成是子集生成问题。将字符串中的字母变成对应的大小写形式,如果有n个字母就可以生成2^n种排列方式。
* 在java中将小写字母转换成大写字母,主要是将字符的值减去32即可。
* 处理思路:
* 首先将字符中的所有字母变为小写,然后利用子集生成生成算法,当需要用到对应位置的元素时,将对应位置的字母切换成大写,然后存储到
* list中即可。
*/
public class LetterCasePermutation2 {
public static char convertChar(char c) {
char a = ' ';
if (Character.isLetter(c)) {
if (Character.isLowerCase(c)) {
a = (char) (c - 32);
}
}
else{
return c;
}
return a;
}
public static String getsubset(int n,int t,String S){
StringBuffer buffer = new StringBuffer(S);
for (int i=0;i<n;i++){
int res = t &(1<<i);
if (res != 0){
buffer.setCharAt(i,convertChar(S.charAt(i)));
}
}
return buffer.toString();
}
public static List<String> letterCasePermutation(String S) {
ArrayList<String> result = new ArrayList<>();
int n = S.length();
S = S.toLowerCase();
for (int i=0;i<(1<<n);i++){
if (!result.contains(getsubset(n,i,S)))
result.add(getsubset(n,i,S));
}
return result;
}
public static void main(String[] args){
String s = "aBc";
ArrayList arrayList = (ArrayList) letterCasePermutation(s);
for (int i=0;i<arrayList.size();i++){
System.out.println(arrayList.get(i));
}
}
}