这道题经过独立思考,通过使用二进制编码的方式来进行处理。分几个步骤一层一层的处理,最终解决了,这道题感觉应该属于medimu级别。

public class Solution
{
/// <summary>
/// 列出二进制表示
/// </summary>
/// <param name="count"></param>
/// <returns></returns>
public IList<string> GetBinaryPartten(int count)
{
var list = new List<string>();
//int count = 5;//字母数量
int N = (int)Math.Pow(, count) - ;//最大值 for (int i = ; i <= N; i++)
{
Stack<int> St = new Stack<int>();
int x = i;//
while (x != )
{
int y = x & ;
St.Push(y);
x >>= ;
} int len = St.Count;//len<=count
string result = "";
for (int j = ; j < count - len; j++)
{
result += "";
} while (St.Any())
{
int y = St.Pop();
result += y.ToString();
} list.Add(result);
}
return list;
} public IList<string> LetterCasePermutation(string S)
{
S = S.ToLower();
var dic = new List<KeyValuePair<int, string>>();
var list = new List<string>();
var numdic = new HashSet<char> { '', '', '', '', '', '', '', '', '', '' };
int count = ;
for (int i = ; i < S.Length; i++)
{
if (numdic.Any(x => x == S[i]))//是数字
{
continue;
}
else//是字母
{
count++;//记录字母的数量
dic.Add(new KeyValuePair<int, string>(i, S[i].ToString()));//记录字母的下标和字母
}
}
var list0 = GetBinaryPartten(count);
foreach (var l0 in list0)
{
string temp = S;//原格式
string map = l0;//当前格式编码
//解析编码
for (int i = ; i < map.Length; i++)
{
//按位解析,i表示dic[i]
var code = map[i];//code表示编码 var d = dic[i];//根据当前位的编码,解析出字符
var position = d.Key;//原串中的下标
var chars = d.Value;//当前字符 if (code == '')
{
chars = chars.ToLower();
}
else
{
chars = chars.ToUpper();
}
//对当前位进行处理
string prefix = temp.Substring(, position);
//string mid = temp.Substring(position, 1);
string mid = chars;//替换此位字符形式
string next = temp.Substring(position + );
temp = prefix + mid + next;
}
//这里将此格式的字符串加入list中
list.Add(temp);
}
return list;
}
}

另一种解法,使用回溯法:

 public class Solution
{
List<string> list = new List<string>();
private void BackTrack(int t, string S)
{
if (t >= S.Length)
{
return;
}
for (int i = t; i < S.Length; i++)
{
var s = S[i];
if (s >= && s <= )
{
continue;//数字0到9
}
else//字母
{
string prefix = S.Substring(, i);
//string mid = temp.Substring(position, 1);
string mid = s.ToString().ToUpper();//替换此位字符形式
string next = S.Substring(i + );
string temp = prefix + mid + next;
list.Add(temp);
BackTrack(i + , temp);
}
}
} public IList<string> LetterCasePermutation(string S)
{
var numdic = new HashSet<char> { '', '', '', '', '', '', '', '', '', '' };
S = S.ToLower();
list.Add(S);
BackTrack(, S);
return list;
}
}

再提供一种回溯法的思路,使用python实现:

 class Solution:
def BackTrack(self,S,l,index,string):
if index < len(S):
c = S[index]
if c.isalpha():
self.BackTrack(S,l,index+1,string+c.lower())
self.BackTrack(S,l,index+1,string+c.upper())
else:
self.BackTrack(S,l,index+1,string+c)
if index == len(S):
l.append(string) return def letterCasePermutation(self, S: 'str') -> 'List[str]':
l = list()
n = len(S)
tags = [0] * n
self.BackTrack(S,l,0,'')
return l

leetcode784的更多相关文章

  1. [Swift]LeetCode784. 字母大小写全排列 | Letter Case Permutation

    Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...

  2. Leetcode784.Letter Case Permutation字母大小写全排列

    给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" 输出: ["a1 ...

随机推荐

  1. Java8_00_资源帖

    一.官方资料 Java Platform Standard Edition 8 Documentation The Java™ Tutorials Java 8 API 二.精选资料 三.参考资料

  2. Struts09---验证框架

    01.创建登录界面 <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  3. LeetCode OJ:Remove Duplicates from Sorted Array(排好序的vector去重)

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  4. Struts2 用过滤器代替了 servlet ,???? 且不需要tomcat就可以直接做功能测试

    Struts2  用过滤器代替了 servlet ,????  且不需要tomcat就可以直接做功能测试

  5. L129

    Iraq Sees Spike in Water-Borne IllnessesIraqi health officials say that a health crisis stemming fro ...

  6. 2017.11.15 Add a parameter –serial <serial no> to the Target field.

    1 exe创建快捷方式,并且加后缀  program --serial 50114130   这是Win里面的一种调用说明. Please note that the programming logs ...

  7. android 删除SD卡或者手机的缓存图片和目录

    public static final String TEMP_PHOTO_FILE_NAME = "temp_photo.jpg"; private static String ...

  8. canvas 绘制坐标轴

    结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...

  9. js实现城市二级联动列表

    这个是一个同事写的,我看着有用,就cv下来了. 程序功能主要逻辑是: 1.当一级标签市显示默认状态 '-请选择-'时,二级标签要隐藏 2.一级标签选中城市时,二级标签显示在页面,并列出响应市区 3.当 ...

  10. squid http_access中的逻辑关系

    http_access通过acl实现访问控制,方法 acl A acltype argument acl B acltype argument 逻辑关系:或 http_access allow|den ...