指定的字符串的大小写排列组合

本文详细解析了将字符串中的字符进行转换的算法实现,包括字符大小写转换、字符组合与拆分等操作。通过对比两种不同的实现方式,展示了在不同场景下各自的优势与效率差异。此外,文章还提供了对字符转换过程的优化建议,旨在提高程序的性能与代码的可读性。

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

  1. 算法解析.

    例如字符串有"abcd"

    那么我可以这样实现: 因为字符是区分大小写的,那么可以采用二叉树的方式来实现.

    实现步骤如下:

    a,  A

    ab, aB, Ab, AB
    abc, abC, aBc, aBC, Abc, AbC, ABc, ABC
    abcd, abcD, abCd, abCD, aBCd, aBCD, Abcd, AbcD, AbCd, AbCD, ABcd, ABcD, ABCd, ABCD


231107_HGv8_90415.png

231107_2xs0_90415.png

3. 实现

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void strToLower(const std::string& str, std::string& target)
{
    for (size_t i = 0; i < str.size(); ++i) {
        if (islower(str[i])) {
            target += str.at(i);
        }
        else {
            target += tolower(str.at(i));
        }
    }
}

std::string Convert(char c)
{
    std::string str;
    str += tolower(c);
    str += toupper(c);

    return str;
}

void test(const std::string& str)
{
    if (str.empty()) {
        return;
    }

    size_t length(0);
    std::vector<std::string> strList;
    std::string strChar = Convert(str.at(0));
    for (size_t i = 0; i < strChar.size(); ++i) {
        strList.push_back(std::string(1, strChar.at(i)));
    }
    for (size_t i = 1; i < str.size(); ++i) {
        std::string strChar = Convert(str.at(i));
        std::vector<std::string> strListTemp;
        for (size_t k = 0; k < strList.size(); ++k) {
            for (size_t j = 0; j < strChar.size(); ++j) {
                std::string strTemp = strList[k];
                strTemp += strChar.at(j);
                strListTemp.push_back(strTemp);
                ++length;
            }
        }
        strList = strListTemp;
    }

    // test
    for (size_t i = 0; i < strList.size(); ++i) {
        std::cout << strList[i] << "\t";
    }
    std::cout << std::endl;
    std::cout << "total length: " << length << std::endl;   //length = 124
}

void test2(const std::string& str)
{
    std::string strTemp;
    //strToLower(str, strTemp);
    strTemp = str;
    size_t strsize = strTemp.size();
    size_t count = 1 << strsize;
    size_t length(0);
    for (size_t i = 0; i < count; ++i) {
        for (size_t j = 0; j < strsize; ++j) {
            int bit = (i >> j) & 1;
            //printf("%ld\t", i >> j);
            strTemp.at(j) = bit ? tolower(strTemp.at(j)) : toupper(strTemp.at(j));
            ++length;
        }

        printf("%s\t", strTemp.c_str());
    }
    printf("total count: %ld\n", length);   //length = 384
}

int main()
{
    std::string str = "aBcDEF";
    test(str);
    test2(str);
    return 0;
}

其中test2()是网络上其他人的实现具体见(http://www.oschina.net/question/1022558_2144600)
比较test() 与 test2();
test() 主代码执行124次;
test2()主代码执行384次.

转载于:https://my.oschina.net/GMT/blog/542514

### Java 中字符大小写转换的方法 在 Java 中,`String` 类提供了多种用于处理字符串的方法,其中包括可以方便地进行大小写转换的功能。具体来说: #### 使用 `toLowerCase()` 和 `toUpperCase()` 这两个方法分别用来将整个字符串转换为全小写或全大写的形式。 ```java public class CaseConversion { public static void main(String[] args) { String original = "HelloWorld"; // 将字符串全部转为小写 String lowerCaseVersion = original.toLowerCase(); System.out.println("Lower case version: " + lowerCaseVersion); // 将字符串全部转为大写 String upperCaseVersion = original.toUpperCase(); System.out.println("Upper case version: " + upperCaseVersion); } } ``` 这段代码展示了如何创建一个新的字符串副本,在其中所有的字母都被转换成了指定大小写形式[^1]。 对于更复杂的场景,比如逐个字符判断其大小写状态并相应地改变它,则可以通过遍历字符串中的每一个字符来完成这一操作。下面是一个具体的例子,该程序实现了对输入字符串“HelloWorld”的逆向读取以及交替变换每个字符的大写字母和小写字母的状态,并最终通过 `StringBuffer` 来构建新的字符串[^2]。 ```java public class Exp3_1 { public static void main(String[] args) { String input = "HelloWorld"; StringBuffer result = new StringBuffer(); for (int i = input.length() - 1; i >= 0; --i) { // 反向迭代 char c = input.charAt(i); if (Character.isUpperCase(c)) { result.append(Character.toLowerCase(c)); } else { result.append(Character.toUpperCase(c)); } } System.out.println(result.toString()); } } ``` 此段代码不仅完成了大小写的反转,还按照要求进行了反向排列输出。 另外一种方式是先将字符串拆分成字符数组,再逐一修改这些字符后再重新组合起来形成新字符串[^3]。不过上述直接基于原字符串的操作已经足够满足大多数需求了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值