字符串的所有大小写组合问题
题目描述:
一个字符串,字符串中的字符只包含ASCII码内的值,请输出字符串的所有大小写组合(若包含非字母,直接输出即可)。
输入:
一个字符串,字符串中的字符只包含ASCII码内的值
输出:
字符串的所有大小写组合(若包含非字母,直接输出即可)
样例输入:
aa123bb
样例输出:
aa123bb
Aa123bb
AA123bb
AA123Bb
AA123BB
AA123bB
Aa123Bb
Aa123BB
Aa123bB
aA123bb
aA123Bb
aA123BB
aA123bB
aa123Bb
aa123BB
aa123bB
**解题思路:**根据题目描述,容易联想到题目考察排列组合知识。样例输入中,字符串aa123bb中包含4个字母,每个字母有大写或小写两种选择,那么字符串aa123bb的大小写组合共有2 * 2 * 2 * 2=16种,但是如何让程序把这16种组合依次输出呢?换个思路,如果0代表小写字母,1代表大写字母,那么16种排列组合就是从0000~1111。所以,16种排列组合可以用从0至15的二进制数字表示。理清了思路,下面来看下具体的编码实现。
import java.util.Scanner;
/**
* 字符串的所有大小写组合问题
* @author zhaoheng
* @date 2018年9月28日
*/
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
char array [] = line.toCharArray();
//标识字符串的某个位置是字母还是非字母
boolean flag [] = new boolean [array.length];
int n = 1; //字符串大小写组合的总数
int count = 0; //统计给定的字符串中包含的字母个数
for (int i = 0; i < array.length; i++) {
if (Character.isLetter(array[i])) {
flag[i] = true; //是字母
n *= 2; //每出现一个字母,组合的总数乘以2
count++;
} else {
flag[i] = false; //非字母
}
}
//打印出每一种字符串组合
for (int i = 0; i < n; i++) {
//将0~n-1转化为二进制数字
String temp = Integer.toBinaryString(i);
StringBuilder sb = new StringBuilder();
for (int j = 0; j < count - temp.length(); j++) {
//追加‘0’,将0变为0000的形式
sb.append("0");
}
sb.append(temp);
char tempArray [] = sb.toString().toCharArray();
int k = 0;
for (int j = 0; j < flag.length; j++) {
char val = array[j]; //先取出该位置上的字符
if (flag[j]) { //该位置上是字母
if ('0' == tempArray[k]) { //小写
System.out.print(Character.toLowerCase(val));
} else { //大写
System.out.print(Character.toUpperCase(val));
}
k++;
} else { //该位置上非字母
System.out.print(val);
}
}
System.out.print("\n");
}
scanner.close();
}
}
编码完成后,我们来做下测试。
观察测试结果,符合我们的预期。这道题目实现起来并不复杂,关键要寻找规律,最终使用排列组合和二进制的方法解决问题。
由于笔主水平有限,笔误或者不当之处还请批评指正。