字符串的所有大小写组合问题

探讨字符串中字母的大小写所有可能组合问题,通过排列组合和二进制方法解决,详细阐述解题思路和编码实现,适用于ASCII码内字符。提供样例输入输出,并邀请读者验证测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串的所有大小写组合问题

题目描述

一个字符串,字符串中的字符只包含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();
	}
}

编码完成后,我们来做下测试。
输入测试数据aa123456
观察测试结果,符合我们的预期。这道题目实现起来并不复杂,关键要寻找规律,最终使用排列组合和二进制的方法解决问题。

由于笔主水平有限,笔误或者不当之处还请批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值