題目如下圖所示:

2018-02-18 19:34:13屏幕截圖.png
通過讀題,發(fā)現(xiàn)需要將字符串中的字母轉(zhuǎn)換成相反的大小寫形式,數(shù)字形式不變。初讀題意比較簡單,但是在實(shí)現(xiàn)的時(shí)候,會(huì)出現(xiàn)很多細(xì)節(jié)問題。通過分析,該問題是子集生成算法的衍生版本。具體思路和代碼實(shí)現(xiàn)如下所示:
import java.util.ArrayList;
import java.util.List;
/**
* Created by hadoop on 18-2-18.
* 晚上整理,整個(gè)問題可以看成是子集生成問題。將字符串中的字母變成對(duì)應(yīng)的大小寫形式,如果有n個(gè)字母就可以生成2^n種排列方式。
* 在java中將小寫字母轉(zhuǎn)換成大寫字母,主要是將字符的值減去32即可。
* 處理思路:
* 首先將字符中的所有字母變?yōu)樾?,然后利用子集生成生成算法,?dāng)需要用到對(duì)應(yīng)位置的元素時(shí),將對(duì)應(yīng)位置的字母切換成大寫,然后存儲(chǔ)到
* 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));
}
}
}