这一题很明显能够想到用dfs,有点像是dfs全排列的弱化版,因为仅仅碰到字母的时候再去抉择。
大概的选择就像是这样:
可能这题我的重点不是在于dfs的使用。而是在这里面的我学到的一些小技巧。
在判断大小写的时候,可能很多的时候都去使用ASCII码,其实我觉得有时候很麻烦,需要自己去记数字。
参考菜鸟教程
isalnum()表示的是字符串是否包含数字和字母
isalpha()表示的是字符串是否就是字母
isupper()表示的是字符是否为大写字母
islower()表示的是字符是否为小写字母
小技巧二:真的是太有用了
大小写转换虽然使用上面的方法,也很难容易,但是可能需要使用if语句。但是有更加好的办法:对字符进行^32。就可以直接进行转化了。
class Solution {
public:
//这个就是一个简单的dfs,存在一个回溯的问题
//就是一个暴力搜索问题
vector<string> res;
void dfs(string s,int u){
//如果枚举到了最后的一位那么直接存储结果
if(u==s.size()){
res.push_back(s);
return;
}
//第一种情况是:直接去进行到底
dfs(s,u+1);
//并没并没有bfs到底
//isalnum()表示的是字符串是否包含数字和字母
//isalpha()表示的是字符串是否就是字母
//isupper()表示的是字符是否为大写字母
//islower()表示的是字符是否为小写字母
if(isalpha(s[u])){
//从大写转化成小写,可以调用函数
//同样可以通过为位运算
//大写->小写 s[u]^=32;
s[u]^=32;
dfs(s,u+1);//修改后再去搜索下一位
}
}
vector<string> letterCasePermutation(string S) {
//传入哪些参数呢?
dfs(S,0);
return res;
}
};