leetcode 784. 字母大小写全排列(c++位运算)

本文介绍了一个使用C++实现的字符串操作案例,通过递归深度优先搜索(DFS)算法生成字符串的所有可能大小写组合。该方法首先定义了一个递归函数用于遍历字符串中的每个字符,并根据字符是否为字母决定是否进行大小写转换。
class Solution {
public:
     
    vector<string>mys;
    vector<string> letterCasePermutation(string S) {
     dfs(S,0);        
     return mys;   
    }
     void dfs(string S,int n)
    {
        if(n==S.size())
        {
            mys.push_back(S);
            return;
        }
        
        dfs(S,n+1);回溯 点(不变)
        if(S[n]>=65)
        {
            S[n]^=32;
             dfs(S,n+1);(变)
            
        }
     }
   
        
};
### C++位运算的使用教程 C++ 提供了一组用于操作二进制位的操作符,这些操作符可以直接对整型变量的每一位进行操作。以下是常用的位运算操作符及其功能: #### 1. 按位与 (`&`) 按位与操作会逐位比较两个操作数的对应位,只有当两位都为 `1` 时结果才为 `1`,否则为 `0`。 ```cpp #include <iostream> using namespace std; int main() { int a = 5; // 二进制: 0101 int b = 3; // 二进制: 0011 cout << (a & b) << endl; // 输出 1, 对应二进制: 0001 return 0; } ``` 此代码展示了如何利用按位与来获取两个数字共同拥有的比特位置[^1]。 --- #### 2. 按位或 (`|`) 按位或操作会对两个操作数的每位进行逻辑加法计算,只要有一位为 `1` 则结果为 `1`。 ```cpp #include <iostream> using namespace std; int main() { int a = 5; // 二进制: 0101 int b = 3; // 二进制: 0011 cout << (a | b) << endl; // 输出 7, 对应二进制: 0111 return 0; } ``` 上述例子说明了如何通过按位或将多个标志组合在一起[^2]。 --- #### 3. 按位异或 (`^`) 按位异或会在两操作数对应的位上执行 XOR 运算,如果两者不同则返回 `1`,相同则返回 `0`。 ```cpp #include <iostream> using namespace std; int main() { int a = 5; // 二进制: 0101 int b = 3; // 二进制: 0011 cout << (a ^ b) << endl; // 输出 6, 对应二进制: 0110 return 0; } ``` 该示例演示了如何交换两个变量而无需额外空间的方法之一[^4]。 --- #### 4. 左移 (`<<`) 和 右移 (`>>`) 左移和右移分别将操作数向高位或低位移动指定数量的位置,溢出部分会被丢弃。 - **左移**相当于乘以 \(2^n\) 的效果。 - **右移**相当于除以 \(2^n\) 的效果(对于无符号数)。 ```cpp #include <iostream> using namespace std; int main() { int a = 8; // 二进制: 1000 cout << (a << 1) << endl; // 输出 16, 向左移动一位等于 *2 cout << (a >> 1) << endl; // 输出 4, 向右移动一位等于 /2 return 0; } ``` 这段代码解释了如何快速实现幂次方或者简单的缩放变换[^3]。 --- ### 常见应用场景 1. **权限管理** 在操作系统或其他软件中,常使用位掩码来表示不同的权限级别。例如: ```cpp const int READ_PERMISSION = 1 << 0; // 0001 const int WRITE_PERMISSION = 1 << 1; // 0010 const int EXECUTE_PERMISSION = 1 << 2; // 0100 int userPermissions = READ_PERMISSION | WRITE_PERMISSION; // 用户具有读写权限 bool canRead = userPermissions & READ_PERMISSION; // 检查是否有读取权限 ``` 2. **状态压缩** 当需要存储大量布尔值的状态时,可以用单个整数代替数组,从而节省内存。 3. **加密解密** 异或操作因其自反性 (\(A \oplus B \oplus A = B\)) 被广泛应用于简单加密算法中。 4. **性能优化** 替代传统的乘法/除法指令完成某些固定倍率的数值转换任务。 --- ### 示例代码:判断字符串中的字符是否唯一 这是一个经典的 LeetCode 题目,可以通过位图的方式高效解决。 ```cpp #include <iostream> #include <string> bool isUnique(const std::string& str) { if (str.length() > 128) return false; // ASCII 字符集大小限制 unsigned long checker = 0; for(char c : str){ int val = static_cast<int>(c); if((checker & (1UL << val)) != 0){ // 如果某位已经被设置过,则重复 return false; } checker |= (1UL << val); // 设置相应位标记已访问过的字符 } return true; } int main(){ std::cout << std::boolalpha << isUnique("abcde") << "\n"; // true std::cout << std::boolalpha << isUnique("hello") << "\n"; // false return 0; } ``` 以上代码实现了基于位运算的空间复杂度 O(1) 解决方案。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值